Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 345302

Summary: Validation of Real literals delivers wrong results
Product: [Modeling] M2T Reporter: Jochen Schmich <jochen.schmich>
Component: XpandAssignee: Karsten Thoms <karsten.thoms>
Status: CLOSED FIXED QA Contact:
Severity: normal    
Priority: P3 CC: sebastian.zarnekow
Version: unspecified   
Target Milestone: ---   
Hardware: PC   
OS: Windows Vista   
Whiteboard:
Attachments:
Description Flags
Reproducing Xpand Project none

Description Jochen Schmich CLA 2011-05-10 13:09:22 EDT
There seems to be some bug in the Xtend grammar definition that leads to wrong validation results about Real literals.

The following piece of code works:

Real works():
	0.10;

This part doesn't:

Real worksNot():
	0.01;
	
0.0'1' <- Every number after the second 0 is considered: extraneous input '1' expecting ';'

Here's a part of the stack trace of the exception which is thrown internally and "swallowed" by Xtend:

MismatchedTokenException(5!=19)
	at org.antlr.runtime.BaseRecognizer.mismatch(BaseRecognizer.java:117)
	at org.antlr.runtime.BaseRecognizer.match(BaseRecognizer.java:99)
	at org.eclipse.internal.xtend.xtend.parser.XtendParser.extension(XtendParser.java:1017)
	at org.eclipse.internal.xtend.xtend.parser.XtendLocationAddingParser.extension(XtendLocationAddingParser.java:46)
	at org.eclipse.internal.xtend.xtend.parser.XtendParser.file(XtendParser.java:200)
	at org.eclipse.internal.xtend.xtend.parser.XtendLocationAddingParser.file(XtendLocationAddingParser.java:211)
	at org.eclipse.internal.xtend.xtend.parser.ParseFacade.file(ParseFacade.java:70)
	at org.eclipse.internal.xtend.xtend.parser.ParseFacade.file(ParseFacade.java:55)
	at org.eclipse.internal.xtend.xtend.parser.ParseFacade.file(ParseFacade.java:50)
	at org.eclipse.internal.xtend.xtend.XtendResourceParser.parse(XtendResourceParser.java:25)
	at org.eclipse.xtend.expression.ResourceManagerDefaultImpl.loadResource(ResourceManagerDefaultImpl.java:70)
	at org.eclipse.xtend.expression.ExecutionContextImpl.internalAllExtensions(ExecutionContextImpl.java:326)
	at org.eclipse.xtend.expression.ExecutionContextImpl.access$0(ExecutionContextImpl.java:310)
	at org.eclipse.xtend.expression.ExecutionContextImpl$1.createNew(ExecutionContextImpl.java:347)
	at org.eclipse.xtend.expression.ExecutionContextImpl$1.createNew(ExecutionContextImpl.java:1)
	at org.eclipse.internal.xtend.util.Cache.get(Cache.java:26)
	at org.eclipse.xtend.expression.ExecutionContextImpl.getExtensionForTypes(ExecutionContextImpl.java:352)
	at org.eclipse.xtend.expression.ExecutionContextImpl.getExtension(ExecutionContextImpl.java:361)
	at org.eclipse.internal.xtend.expression.ast.OperationCall.evaluateInternal(OperationCall.java:72)
	at org.eclipse.internal.xtend.expression.ast.Expression.evaluate(Expression.java:50)
	at org.eclipse.xtend.expression.ExpressionFacade.evaluate(ExpressionFacade.java:56)
	at org.eclipse.xtend.expression.ExpressionFacade.evaluate(ExpressionFacade.java:45)
	at org.eclipse.xtend.XtendComponent.invokeInternal2(XtendComponent.java:190)
	at org.eclipse.xtend.expression.AbstractExpressionsUsingWorkflowComponent.invokeInternal(AbstractExpressionsUsingWorkflowComponent.java:239)
	at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:126)
	at org.eclipse.emf.mwe.core.container.CompositeComponent.internalInvoke(CompositeComponent.java:104)
	at org.eclipse.emf.mwe.core.container.CompositeComponent.invoke(CompositeComponent.java:89)
	at org.eclipse.emf.mwe.core.container.ConditionalComponent.internalInvoke(ConditionalComponent.java:57)
	at org.eclipse.emf.mwe.core.container.ConditionalComponent.invoke(ConditionalComponent.java:39)
	at org.eclipse.emf.mwe.core.container.CompositeComponent.internalInvoke(CompositeComponent.java:104)
	at org.eclipse.emf.mwe.core.container.CompositeComponent.invoke(CompositeComponent.java:89)
	at org.eclipse.emf.mwe.core.container.ConditionalComponent.internalInvoke(ConditionalComponent.java:57)
	at org.eclipse.emf.mwe.core.container.ConditionalComponent.invoke(ConditionalComponent.java:39)
	at org.eclipse.emf.mwe.core.container.CompositeComponent.internalInvoke(CompositeComponent.java:104)
	at org.eclipse.emf.mwe.core.container.CompositeComponent.invoke(CompositeComponent.java:89)
	at org.eclipse.emf.mwe.core.WorkflowRunner.executeWorkflow(WorkflowRunner.java:408)
Comment 1 Karsten Thoms CLA 2011-08-23 15:57:27 EDT
Created attachment 202033 [details]
Reproducing Xpand Project
Comment 2 Karsten Thoms CLA 2011-08-23 16:50:54 EDT
The Lexer rule "IntValue" accepts only a single "0" or "1..9" followed by other digits.

   IntLiteral : ('0' | '1'..'9' '0'..'9'*) ;

I think the reason was that no integer values with leading zeros should be allowed.
================================================================
numberLiteral  returns [Expression e] :
  	a=IntLiteral {$e=factory.createIntegerLiteral(id(a));}
| 	a=IntLiteral b='.' c=IntLiteral {$e=factory.createRealLiteral(id(a).append(id(b)).append(id(c)));}
;
================================================================

Changing the IntValue to 
   IntLiteral : '0'..'9'+ ;

would solve the issue, but also allow leading zeros.
Comment 3 Sebastian Zarnekow CLA 2011-08-25 03:38:34 EDT
I think leading zeros are ok and they won't break existing templates.
Comment 4 Karsten Thoms CLA 2011-08-25 08:11:27 EDT
Sebastian, thanks for your input. I also think this is reasonable, but wanted a second thought. I'll fix that now.
Comment 5 Jochen Schmich CLA 2011-08-25 08:14:44 EDT
Thanks from my side, too - nice work
Comment 6 Karsten Thoms CLA 2011-08-25 08:36:04 EDT
Changed the definition of IntLiteral in Xpand.g and Xtend.g.

In Xpand.g I had to comment out
--------------------------------------------
fragment
VOCAB :
	('\3'..'\u00aa'|'\u00ac'..'\u00ba'|'\u00bc'..'\ufffe')
;
--------------------------------------------

AntlWorks refused to generate the parser with the error message:
Xpand.g:469:3: syntax error: antlr: Xpand.g:469:3: unexpected token: '\3'


Added unit tests:
- StatementParserTest#testReal
- ExtensionParserTest#testReal
Comment 7 Karsten Thoms CLA 2013-02-21 08:12:23 EST
Bug resolved before Xpand 1.2 release date => Closing