Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » TMF (Xtext) » NPE in serializer
NPE in serializer [message #900609] Tue, 07 August 2012 14:42 Go to previous message
Tim Geisler is currently offline Tim Geisler
Messages: 34
Registered: July 2009
Member
Hi,

I get the following NPE when using the new serializer to serialize a model constructed by a M2M transformation. The model seems to be correct, i.e. no feature assignment is missing.

java.lang.NullPointerException
	at org.eclipse.xtext.serializer.sequencer.AbstractSyntacticSequencer.accept(AbstractSyntacticSequencer.java:104)
	at org.eclipse.xtext.serializer.sequencer.AbstractSyntacticSequencer.navigateToAbsorber(AbstractSyntacticSequencer.java:426)
	at org.eclipse.xtext.serializer.sequencer.AbstractSyntacticSequencer.navigateToAbsorber(AbstractSyntacticSequencer.java:414)
	at org.eclipse.xtext.serializer.sequencer.AbstractSyntacticSequencer.finish(AbstractSyntacticSequencer.java:346)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.finish(SequenceFeeder.java:369)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:442)
	at xxx.cml.serializer.AbstractCmlSemanticSequencer.sequence_WhenUnlessExpression(AbstractCmlSemanticSequencer.java:2308)
	at xxx.cml.serializer.AbstractCmlSemanticSequencer.createSequence(AbstractCmlSemanticSequencer.java:1084)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptAction(SequenceFeeder.java:292)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:95)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:403)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:439)
	at xxx.cml.serializer.AbstractCmlSemanticSequencer.sequence_WhenUnlessExpression(AbstractCmlSemanticSequencer.java:2308)
	at xxx.cml.serializer.AbstractCmlSemanticSequencer.createSequence(AbstractCmlSemanticSequencer.java:1084)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:299)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:325)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:215)
	at xxx.cml.serializer.AbstractCmlSemanticSequencer.sequence_ConditionalExpression(AbstractCmlSemanticSequencer.java:1174)
	at xxx.cml.serializer.AbstractCmlSemanticSequencer.createSequence(AbstractCmlSemanticSequencer.java:257)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptAction(SequenceFeeder.java:292)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:95)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:403)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:439)
	at xxx.cml.serializer.AbstractCmlSemanticSequencer.sequence_AdditiveExpression(AbstractCmlSemanticSequencer.java:1097)
	at xxx.cml.serializer.AbstractCmlSemanticSequencer.createSequence(AbstractCmlSemanticSequencer.java:125)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:299)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:325)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:222)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:401)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:439)


The relevant part of the grammar is the following:
Expression
    :   ConditionalExpression
    |   WhenUnlessExpression
    |   SwitchExpression
    ;
    
ConditionalExpression
    :   'if' condition=Expression 'then' valueIfTrue=Expression 'else' valueIfFalse=Expression
    ;
    
WhenUnlessExpression returns Expression
    :   ConditionalOrExpression ({WhenUnlessExpression.value=current} operator=('when' | 'unless') condition=Expression)?
    ;
    
SwitchExpression
    :   'switch' expression=Expression '{' (caseClauses+=CaseClause)* ('default' ':' defaultExpression=Expression) '}'
    ;
    
CaseClause
    :   'case' caseExpressions+=Expression (':' 'case' caseExpressions+=Expression)* ':' valueExpression=Expression
    ;
    
ConditionalOrExpression returns Expression
    :   ConditionalAndExpression ({ConditionalOrExpression.left=current} operator='||' right=ConditionalAndExpression)*
    ;

... // left out

Primary returns Expression
    :   ParenthesizedExpression
    |   Literal
... // left out
    ;   
    
ParenthesizedExpression returns Expression
	:	'(' Expression ')'
	;


The mysterious issue is that this problem only occurs if two WhenUnlessExpression objects are nested (you can see this in the stack trace).

Are there any ideas on how to fix this problem? Is there an alternative formulation of the grammar for which the serializer is successful?

How to adapt the serializer? I guess sequence_WhenUnlessExpression will have to be adapted. But how?

I'd appreciate any hints on how to fix this problem.

Best regards,

Tim
 
Read Message
Read Message
Read Message
Read Message
Previous Topic:Scope for starting element
Next Topic:Serialize models containing cross-references
Goto Forum:
  


Current Time: Fri May 24 02:04:37 EDT 2013

Powered by FUDForum. Page generated in 0.01590 seconds