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
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 }