author | Tony Garnock-Jones <tonyg@kcbbs.gen.nz> |
Sat, 17 Jan 2009 23:04:15 +0000 | |
changeset 202 | 65694ce5407c |
parent 201 | 9b22b7a23e39 |
child 203 | 580fc03b9e18 |
permissions | -rw-r--r-- |
181
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
1 |
-- -*- text -*- |
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
2 |
|
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
3 |
toplevel = toplevel-item:v ~_ -> v; |
184 | 4 |
|
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
5 |
toplevel-item = |
198
072745b48add
Improve parser to the point where metaeval.tng at least parses.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
186
diff
changeset
|
6 |
{#paren #namespace :prefix ?(symbol? prefix) equal :urn ?(string? urn) ~_ |
072745b48add
Improve parser to the point where metaeval.tng at least parses.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
186
diff
changeset
|
7 |
-> `(define-namespace ,prefix ,urn)} |
072745b48add
Improve parser to the point where metaeval.tng at least parses.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
186
diff
changeset
|
8 |
| {#paren #namespace :urn ?(string? urn) ~_ |
072745b48add
Improve parser to the point where metaeval.tng at least parses.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
186
diff
changeset
|
9 |
-> `(declare-default-namespace ,urn)} |
072745b48add
Improve parser to the point where metaeval.tng at least parses.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
186
diff
changeset
|
10 |
| {#paren #define :q ?(qname-or-symbol? q) equal expr:exp ~_ |
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
11 |
-> `(define-value ,q ,exp)} |
198
072745b48add
Improve parser to the point where metaeval.tng at least parses.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
186
diff
changeset
|
12 |
| {#paren #define :q ?(qname-or-symbol? q) normal-method:def ~_ |
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
13 |
-> `(define-function ,q ,def)} |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
14 |
| parse |
184 | 15 |
; |
181
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
16 |
|
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
17 |
parse = |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
18 |
~(comma | semi) |
181
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
19 |
:n |
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
20 |
( -> (or (pair? n) (error 'expected 'grouping)) grouping(n) |
198
072745b48add
Improve parser to the point where metaeval.tng at least parses.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
186
diff
changeset
|
21 |
| ?(qname-or-symbol? n) -> `(ref ,n) |
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
22 |
| ?(or (string? n) (number? n)) -> `(lit ,n) ) |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
23 |
| -> (error 'comma-and-semi-are-illegal-expressions) |
181
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
24 |
; |
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
25 |
|
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
26 |
grouping = |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
27 |
{#paren expr:e ~_ -> e} |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
28 |
| {#brack methods:ms -> `(object ,@ms)} |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
29 |
| {#brace methods:ms -> `(function ,@ms)} |
181
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
30 |
; |
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
31 |
|
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
32 |
expr = |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
33 |
:head ?(special-segment-head? head) special-segment(head) |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
34 |
| tuple:elts -> (if (= (length elts) 1) (car elts) `(tuple ,@elts)) |
181
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
35 |
; |
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
36 |
|
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
37 |
special-segment = |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
38 |
:head ?(equal? head QUOTE-QNAME) :n -> `(lit ,n) |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
39 |
| :head ?(equal? head UNQUOTE-QNAME) -> (error 'naked-unquote) |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
40 |
| #do expr:e1 semis expr:e2 |
202
65694ce5407c
Make (discard) like all other pattern ASTs: wrapped in parens.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
201
diff
changeset
|
41 |
-> `(send (function (method ((discard)) ,e2)) ,e1) |
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
42 |
| #let pattern:p equal expr:e semis expr:body |
201
9b22b7a23e39
Convert constant-methods to normal methods.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
198
diff
changeset
|
43 |
-> `(send (function (method (,p) ,body)) ,e) |
181
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
44 |
; |
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
45 |
|
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
46 |
tuple = |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
47 |
send:s (comma send)*:ss -> (cons s ss) |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
48 |
| ~_ -> '() |
181
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
49 |
; |
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
50 |
|
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
51 |
send = |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
52 |
parse:receiver message*:messages |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
53 |
-> (fold (lambda (msg rcvr) `(send ,rcvr ,msg)) receiver messages) |
181
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
54 |
; |
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
55 |
|
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
56 |
message = ~(arrow | equal) parse; |
181
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
57 |
|
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
58 |
methods = |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
59 |
normal-method:m semis methods:ms -> (cons m ms) |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
60 |
| constant-method:m semis methods:ms -> (cons m ms) |
202
65694ce5407c
Make (discard) like all other pattern ASTs: wrapped in parens.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
201
diff
changeset
|
61 |
| &_ expr:e semis ~_ -> (list `(method ((discard)) ,e)) |
198
072745b48add
Improve parser to the point where metaeval.tng at least parses.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
186
diff
changeset
|
62 |
| semis ~_ -> '() |
181
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
63 |
; |
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
64 |
|
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
65 |
normal-method = |
201
9b22b7a23e39
Convert constant-methods to normal methods.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
198
diff
changeset
|
66 |
(~&(arrow | equal) pattern)+:patterns arrow expr:body |
9b22b7a23e39
Convert constant-methods to normal methods.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
198
diff
changeset
|
67 |
-> `(method ,patterns ,body) |
181
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
68 |
; |
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
69 |
|
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
70 |
constant-method = |
201
9b22b7a23e39
Convert constant-methods to normal methods.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
198
diff
changeset
|
71 |
(~&(arrow | equal) pattern)+:patterns equal expr:body |
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
72 |
-> `(constant-method ,patterns ,body) |
181
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
73 |
; |
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
74 |
|
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
75 |
pattern = pattern-tuple-nonempty:elts -> (if (= (length elts) 1) (car elts) `(tuple ,@elts)); |
181
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
76 |
|
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
77 |
pattern-tuple-nonempty = |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
78 |
pattern-element:e (comma pattern-element)*:es |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
79 |
-> (cons e es) |
181
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
80 |
; |
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
81 |
|
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
82 |
pattern-tuple = pattern | -> `(tuple); |
181
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
83 |
|
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
84 |
pattern-element = |
181
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
85 |
~(#do | #let) |
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
86 |
:n |
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
87 |
( -> (or (pair? n) (error 'expected 'grouping)) pattern-grouping(n) |
202
65694ce5407c
Make (discard) like all other pattern ASTs: wrapped in parens.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
201
diff
changeset
|
88 |
| ?(eq? n DISCARD) -> `(discard) |
198
072745b48add
Improve parser to the point where metaeval.tng at least parses.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
186
diff
changeset
|
89 |
| ?(qname-or-symbol? n) -> `(bind ,n) |
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
90 |
| ?(or (string? n) (number? n)) -> `(lit ,n) |
181
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
91 |
) |
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
92 |
; |
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
93 |
|
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
94 |
pattern-grouping = |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
95 |
{#paren quote :n -> `(lit ,n)} |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
96 |
| {#paren pattern-tuple:p ~_ -> p} |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
97 |
| {#brace -> (error 'object-matching-not-supported)} |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
98 |
| {#brack -> (error 'function-matching-not-supported)} |
181
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
99 |
; |
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
100 |
|
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
101 |
semis = (:x ?(eq? x SEMI))*; |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
102 |
semi = :x ?(eq? x SEMI) -> x; |
181
f82ec080be39
etng-r2, using ometa-scheme.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
diff
changeset
|
103 |
|
186
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
104 |
quote = :x ?(equal? x QUOTE-QNAME) -> x; |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
105 |
comma = :x ?(eq? x COMMA) -> x; |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
106 |
arrow = :x ?(eq? x ARROW) -> x; |
9426a54b733b
Update grammars for new ometa-scheme syntax.
Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
parents:
184
diff
changeset
|
107 |
equal = :x ?(eq? x '=) -> x; |