--- a/etng-r2/etng-parser.g Thu Jan 22 17:49:18 2009 +0000
+++ b/etng-r2/etng-parser.g Thu Jan 22 18:13:28 2009 +0000
@@ -15,7 +15,7 @@
;
parse =
- ~(comma | semi | arrow | equal)
+ ~(comma | semi | arrow | equal | pipe)
:n
( grouping(n)
| ?(qname-or-symbol? n) -> `(ref ,n)
@@ -24,6 +24,7 @@
| semi -> (error 'extra 'semi)
| arrow -> (error 'extra 'arrow)
| equal -> (error 'extra 'equal)
+ | pipe -> (error 'extra 'pipe)
| -> (error)
;
@@ -69,6 +70,21 @@
;
send =
+ parse:receiver message*:messages
+ -> (fold (lambda (msg rcvr) (msg rcvr)) receiver messages)
+ | message+:messages
+ -> (let ((g (gensym 'pipe)))
+ `(function (method ((bind ,g)) ,(fold (lambda (msg rcvr) (msg rcvr))
+ `(ref ,g)
+ messages))))
+;
+
+message =
+ parse:p -> (lambda (rcvr) `(send ,rcvr ,p))
+ | pipe parse:p -> (lambda (msg) `(send ,p ,msg))
+;
+
+send =
parse:receiver message*:messages
-> (fold (lambda (msg rcvr) `(send ,rcvr ,msg)) receiver messages)
;
@@ -125,3 +141,4 @@
comma = :x ?(eq? x COMMA) -> x;
arrow = :x ?(eq? x ARROW) -> x;
equal = :x ?(eq? x '=) -> x;
+pipe = :x ?(eq? x PIPE) -> x;