Parsing Exponent Expression [message #1777341] |
Tue, 28 November 2017 11:10  |
Eclipse User |
|
|
|
Hello.
I am strugging to parse an exponent expression.
My issue is that the "nested" exponent expression is not being parsed.
Please refer to the attached screenshots for detail.
Request:
What changes do I need to make to the grammer (below) to be able to parse the nested exponent expression?
Addtional Information:
Precedence of expression:
- ()
- **
- *, /
- =, <>, >, >=, <, <=
- AND
- OR
@Test def void testExponentiation() {
"2**3**4".assertRepr("(2 ** (3 ** 4))")
}
def private String stringRepr(Expression e) {
switch (e) {
Plus: '''(«e.left.stringRepr» + «e.right.stringRepr»)'''
Minus: '''(«e.left.stringRepr» - «e.right.stringRepr»)'''
MulOrDiv: '''(«e.left.stringRepr» «e.op» «e.right.stringRepr»)'''
Exponent: '''(«e.left.stringRepr» ** «e.right.stringRepr»)'''
Comparison: '''(«e.left.stringRepr» «e.op» «e.right.stringRepr»)'''
Equality: '''(«e.left.stringRepr» «e.op» «e.right.stringRepr»)'''
And: '''(«e.left.stringRepr» AND «e.right.stringRepr»)'''
Or: '''(«e.left.stringRepr» OR «e.right.stringRepr»)'''
Not: '''(NOT «e.expression.stringRepr»)'''
IntConstant: '''«e.value»'''
StringConstant: '''«e.value»'''
BoolConstant: '''«e.value»'''
}.toString
}
Model:
expressions+=AbstractExpression*
;
AbstractExpression:
'EVAL' 'foo' '=' expression=Expression ';';
Expression: Or;
Or returns Expression:
And (
{Or.left=current} 'OR'
right=And
)*;
And returns Expression:
Equality (
{And.left=current} 'AND'
right=Equality
)*;
Equality returns Expression:
Comparison (
{Equality.left=current} op=('=' | '<>')
right=Comparison
)*;
Comparison returns Expression:
PlusOrMinus (
{Comparison.left=current} op=('>=' | '<=' | '>' | '<')
right=PlusOrMinus
)*;
PlusOrMinus returns Expression:
MulOrDiv (
({Plus.left=current} '+' | {Minus.left=current} '-')
right=MulOrDiv
)*;
MulOrDiv returns Expression:
Exponent (
({MulOrDiv.left=current} op=('*' | '/'))
right=Exponent
)*;
Exponent returns Expression:
Primary (
{Exponent.left=current} '**' right=Primary)?;
Primary returns Expression:
'(' Expression ')' |
{Not} 'NOT' expression=Primary |
Atomic;
Atomic returns Expression:
{IntConstant} value=INT |
{StringConstant} value=STRING |
{BoolConstant} value=('*ON' | '*OFF') ;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.04961 seconds