RegularExpression: OrExpression ; OrExpression: SequenceExpression ({OrExpression.left = current} '+' right=OrExpression)* ; SequenceExpression: HighBindExpression({SequenceExpression.left = current} right = SequenceExpression)* // note the abscence of a syntactic separating symbol -> juxtaposition! ; HighBindExpression: AtomicExpression | StarExpression ; AtomicExpression: BracedExpression | Atom ; StarExpression: innerExpression = AtomicExpression '*'('*')* // note: we ignore all stars after the first, since a* = a**, but // syntactically it should still be valid ; BracedExpression: '(' innerExpression = RegularExpression ')' ; Atom: value = CHAR ; terminal CHAR returns ecore::EChar: ('a'..'z'|'A'..'Z'|'0'..'9') ;
grammar org.xtext.example.mydsl4.MyDsl hidden(WS) generate myDsl "http://www.xtext.org/example/mydsl4/MyDsl" import "http://www.eclipse.org/emf/2002/Ecore" as ecore RegularExpression: OrExpression ; OrExpression: SequenceExpression ({OrExpression.left = current} '+' right=SequenceExpression)* ; SequenceExpression: HighBindExpression({SequenceExpression.left = current} right = HighBindExpression)* // note the abscence of a syntactic separating symbol -> juxtaposition! ; HighBindExpression: AtomicExpression ('*'{StarExpression.innerExpression=current} '*'* )? ; AtomicExpression: BracedExpression | Atom ; BracedExpression: '(' innerExpression = RegularExpression ')' ; Atom: value = CHAR ; terminal CHAR returns ecore::EChar: ('a'..'z'|'A'..'Z'|'0'..'9') ; terminal WS : (' '|'\t'|'\r'|'\n')+; terminal ANY_OTHER: .;