|
|
@ -1,50 +1,54 @@ |
|
|
|
grammar = - ( d:definition { d; } |
|
|
|
| end-of-file { nil; } |
|
|
|
grammar = - ( d:definition { global yysval = d; } |
|
|
|
| end-of-file { global yysval = nil; } |
|
|
|
) |
|
|
|
|
|
|
|
definition = i:identifier ASSIGN e:expression SEMI? { Definition.new(name: i, expression: e); } |
|
|
|
definition = i:identifier ASSIGN e:expression SEMI? { $$ = Definition.new(name: i, expression: e); } |
|
|
|
|
|
|
|
expression = s:sequence !BAR { s; } |
|
|
|
expression = s:sequence !BAR { $$ = s; } |
|
|
|
| s1:sequence { s1 = Alternation.new().push(s1); } |
|
|
|
( BAR s2:sequence { s1.push(s2); } |
|
|
|
) * { s1; } |
|
|
|
) * { $$ = s1; } |
|
|
|
|
|
|
|
startSequence = - s:sequence { global yysval = s; } |
|
|
|
|
|
|
|
sequence = p:prefix ( q:prefix { p = Sequence.new().push(p).push(q); } |
|
|
|
( q:prefix { p.push(q); } |
|
|
|
) * ) ? { p; } |
|
|
|
) * ) ? { $$ = p; } |
|
|
|
|
|
|
|
prefix = AND a:action { ParseTimeAction.new(action: a); } |
|
|
|
| AT a:action { ExecuteAction.new(action: a); } |
|
|
|
prefix = AND a:action { $$ = ParseTimeAction.new(action: a); } |
|
|
|
| AT a:action { $$ = ExecuteAction.new(action: a); } |
|
|
|
| |
|
|
|
( AND s:suffix { And.new(expression: s); } |
|
|
|
| NOT s:suffix { Not.new(expression: s); } |
|
|
|
| s:suffix { s; } |
|
|
|
( AND s:suffix { $$ = And.new(expression: s); } |
|
|
|
| NOT s:suffix { $$ = Not.new(expression: s); } |
|
|
|
| s:suffix { $$ = s; } |
|
|
|
) |
|
|
|
|
|
|
|
suffix = p:primary |
|
|
|
( QUERY { p = Optional.new(expression: p); } |
|
|
|
| STAR { p = Star.new(expression: p); } |
|
|
|
| PLUS { p = Plus.new(expression: p); } |
|
|
|
) ? { p; } |
|
|
|
) ? { $$ = p; } |
|
|
|
|
|
|
|
primary = i1:identifier COLON i2:ruleCall !ASSIGN { Assignment.new(name: i1, rule: i2); } |
|
|
|
| i:ruleCall !ASSIGN { i; } |
|
|
|
| LPAREN e:expression RPAREN { e; } |
|
|
|
| l:literal { l; } |
|
|
|
| c:class { c; } |
|
|
|
| DOT { Dot.new(); } |
|
|
|
| a:action { a; } |
|
|
|
| BEGIN e:expression END { Capture.new(expression: e); } |
|
|
|
primary = i1:identifier COLON i2:ruleCall !ASSIGN { $$ = Assignment.new(name: i1, rule: i2); } |
|
|
|
| i:ruleCall !ASSIGN { $$ = i; } |
|
|
|
| LPAREN e:expression RPAREN { $$ = e; } |
|
|
|
| l:literal { $$ = l; } |
|
|
|
| c:class { $$ = c; } |
|
|
|
| DOT { $$ = Dot.new(); } |
|
|
|
| a:action { $$ = a; } |
|
|
|
| BEGIN e:expression END { $$ = Capture.new(expression: e); } |
|
|
|
|
|
|
|
identifier = < [-a-zA-Z_][-a-zA-Z_0-9]* > - { intern(yytext); } |
|
|
|
identifier = < [-a-zA-Z_][-a-zA-Z_0-9]* > - { $$ = intern(yytext); } |
|
|
|
|
|
|
|
ruleCall = n:identifier CCOLON r:identifier { NamespacedRuleCall.new(namespace: n, name: r); } |
|
|
|
| i:identifier { RuleCall.new(name: i); } |
|
|
|
ruleCall = n:identifier CCOLON r:identifier { $$ = NamespacedRuleCall |
|
|
|
.new(namespace: GetVar.new(name: n).__eval__(), name: r); |
|
|
|
} |
|
|
|
| i:identifier { $$ = RuleCall.new(name: i); } |
|
|
|
|
|
|
|
literal = ['] < ( !['] char )* > ['] - { StringLiteral.new(string: yytext); } |
|
|
|
| ["] < ( !["] char )* > ["] - { StringLiteral.new(string: yytext); } |
|
|
|
literal = ['] < ( !['] char )* > ['] - { $$ = StringLiteral.new(string: yytext.unescaped()); } |
|
|
|
| ["] < ( !["] char )* > ["] - { $$ = StringLiteral.new(string: yytext.unescaped()); } |
|
|
|
|
|
|
|
class = '[' < ( !']' range )* > ']' - { CharacterClass.new(value: yytext); } |
|
|
|
class = '[' < ( !']' range )* > ']' - { $$ = CharacterClass.new(value: yytext.unescaped()); } |
|
|
|
|
|
|
|
range = char '-' char | char |
|
|
|
|
|
|
@ -53,7 +57,7 @@ char = '\\' [abefnrtv'"\[\]\\] |
|
|
|
| '\\' [0-7][0-7]? |
|
|
|
| !'\\' . |
|
|
|
|
|
|
|
action = m:metaLanguage::block - { Action.new(parseTree: Block.new(body: m)); } |
|
|
|
action = m:metaGrammar::block - { $$ = Action.new(parseTree: Block.new(body: m)); } |
|
|
|
|
|
|
|
- = ( space | comment )* |
|
|
|
space = ' ' | '\t' | end-of-line |
|
|
|