bootstrap
view genesis/ometa/ometa-parser.g @ 867:3557dbdaf618
add new macros for getting and setting array values, which can work on both byte and word sized arrays
comment out some debugging print statements
comment out some debugging print statements
| author | John Leuner <jewel@subvert-the-dominant-paradigm.net> |
|---|---|
| date | Sun Apr 15 19:17:11 2012 +0200 (4 weeks ago) |
| parents | 42c043932622 |
| children |
line source
1 ometa ometa-parser <: ometa {
2 nameFirst = letter | $_,
3 nameRest = nameFirst | digit | $- | $!,
4 tsName = nameFirst:f nameRest*:r -> <<`(_string ,f ,r)>>,
5 name = wsnl* tsName,
7 characters = "''''",
8 sCharacters = stringquote (~stringquote anything)*:xs stringquote -> <<'(_quoted_string ,xs)>>,
10 osymbol = wsnl* "#" tsName:s -> << `(app exactly (symbol ,s))>>,
11 char-literal = "$" anything:d -> << `(app exactly (character ,d)) >>,
12 onumber = digit+:ds -> <<`(app exactly (_number ,ds))>>,
13 letterOrDigit = letter | digit,
15 args = "(" hostExpr:x ")" -> << x >>,
18 application = name:rule args:as -> <<('app rule as)>> | name:rule1 -> <<('app rule1)>>,
20 hostExpr = wsnl* (curlyHostExpr | atomicHostExpr),
21 curlyHostExpr = wsnl* "<<" (~">>" anything)*:xs ">>" -> << `(act ,xs) >>,
22 atomicHostExpr = (sCharacters | name):x -> <<x>>,
24 semAction = wsnl* ("!" | "->") wsnl* (atomicHostExpr:x -> <<('act x)>>
25 | wsnl* curlyHostExpr:x -> <<x>>),
26 semPred = wsnl* "?" hostExpr:x -> <<('pred x)>>,
27 expr = expr4:h (wsnl* "|" wsnl* expr4)*:t -> <<('or h t)>>,
28 expr4 = (wsnl* expr3)*:xs -> << `(and ,xs)>>,
29 optIter :x = "*" -> <<('many x)>>
30 | "+" -> <<('many1 x)>>
31 | empty -> <<x>>,
32 expr3 = expr2:x optIter(x):x ( ":" name:n -> << ('set n x) >>
33 | empty -> << x >>
34 )
35 | ":" name:n -> << ('set n ('loadarg)) >>,
36 expr2 = wsnl* "~" expr2:x -> <<('not x)>>
37 | wsnl* "&" expr1:x -> <<('lookahead x)>>
38 | expr1,
39 expr1 = application | semAction | semPred
40 | wsnl* (characters | sCharacters:s -> <<`(app token ,s)>> | char-literal | osymbol | onumber)
41 | wsnl* "(" wsnl* expr:x wsnl* ")" -> <<x>>,
42 rulearg = (":" name:argname wsnl* -> <<argname>>)* | empty,
44 comment = ";" (~cnewline anything)* cnewline,
45 rule-flags = (("transient" | "inline"):flag ws+ -> << flag >>)*,
46 rule = comment* rule-flags:flags name:n wsnl* rulearg:locals wsnl* "=" wsnl* expr:rhs -> << `(rule1 ,n ,flags ,locals ,rhs) >>,
48 ws = $ | $ ,
49 wsnl = ws | cnewline,
51 empty = -> <<'true>>,
52 grammar = "ometa" ws+ name:n wsnl* ("<:" name | empty -> <<'OMeta>>):sn wsnl* "{" wsnl* rule:h wsnl* ("," wsnl* rule)*:t wsnl* "}" wsnl* -> << ('grammar n sn h t) >>
54 }
