Expression Language: Using ".*" in combination with Decimal Numbers [message #1774566] |
Tue, 17 October 2017 11:57 |
Lukas Schaus Messages: 37 Registered: October 2016 |
Member |
|
|
Hi,
i am trying to model a portion of the MATLAB Syntax. I have problems with Expressions that contain the ".*" operator.
Here is a small portion of my Grammar:
grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"
import "http://www.eclipse.org/emf/2002/Ecore" as ecore
Model:
exp=MExpression;
NumberLiteral:
{NumberLiteral} number=NUMBER
;
MExpression:
MBinaryOperation
;
MBinaryOperation returns MExpression:
MUnaryOperation =>({MBinaryOperation.left=current} op=MBINARY_OPERATOR right=MUnaryOperation)*
;
MBINARY_OPERATOR
: '*' | '/' | '+' | '-' | '^' | './' | '.*' | '.\\' | '\\'
;
MUnaryOperation returns MExpression:
{MUnaryOperation} opUnary=MUNARY_OPERATOR? operand=MPrimaryExpression
;
MUNARY_OPERATOR:
'-' | '+'
;
MPrimaryExpression returns MExpression
: lBrace='(' expression=MExpression rBrace=')'
| Literal
;
Literal
: NumberLiteral
| BooleanLiteral
;
BooleanLiteral:
{BooleanLiteral} ('true' | 'false')
;
terminal NUMBER returns ecore::EBigDecimal:
('0'..'9')* ('.' ('0'..'9')+)?(('E'|'e')('-'|'+')?('0'..'9')*)?;
//@Override
terminal INT returns ecore::EInt:
'this one has been deactivated';
The workflow does not raise any errors or warnings unsing Xtext 2.8 and JDK 1.6 in eclipse Kepler.
The following input leads to a Syntax Error:
The Stacktrace indicates, that the parser tries to match the NUMBER rule after it consumed the '.' :
java.lang.AssertionError: Expected no issues, but got :ERROR (org.eclipse.xtext.diagnostics.Diagnostic.Syntax) 'required (...)+ loop did not match anything at character '*'' on MBinaryOperation, offset 0, length 2
ERROR (org.eclipse.xtext.diagnostics.Diagnostic.Syntax) 'no viable alternative at input '*'' on MBinaryOperation, offset 2, length 1
ERROR (org.eclipse.xtext.diagnostics.Diagnostic.Syntax) 'no viable alternative at input ';'' on MBinaryOperation, offset 4, length 1
at org.junit.Assert.fail(Assert.java:88)
at org.eclipse.xtext.junit4.validation.ValidationTestHelper.assertNoIssues(ValidationTestHelper.java:164)
at org.eclipse.xtext.junit4.validation.ValidationTestHelper.assertNoIssues(ValidationTestHelper.java:43)
at org.xtext.example.mydsl.tests.ParserTests.parseInitSimpleAssignmentToSignal(ParserTests.java:35)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.eclipse.xtext.junit4.XtextRunner$1.evaluate(XtextRunner.java:49)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
I was wondering how I could refactor my grammar and would be very grateful for any help.
P.S.: backtracking does not solve the problem
Greetings
Lukas
|
|
|
|
Powered by
FUDForum. Page generated in 0.02706 seconds