rule ruleIfstatement has non-LL(*) decision due to recursive rule invocations [message #901519] |
Mon, 13 August 2012 08:41 |
Laigle jérôme Messages: 26 Registered: August 2012 |
Junior Member |
|
|
Hi,
I'm working on a DSL and i have problem with my grammar for define if
I need to support this type of instruction for example:
if a<0 : b++
if b<5
c++
d++
endif
So, I've started with the following construct
Ifstatement:
IfSimpleInstruction|IfSeveralInstruction
;
IfSimpleInstruction:
{IfSimpleInstruction}'if'(expressions=Expression) ':'instruction=Instruction
;
IfSeveralInstruction:
{IfSeveralInstruction}
'if'(expressions=Expression)
then+=Instruction*
(=>'else' else+=Instruction*)?
'endif'
;
Instruction:
ControleStructure|VariableDeclaration|VariableAssignment
;
VariableAssignment:
dcl=[VariableDeclaration]'='expr=Expression
;
ControleStructure:
Ifstatement
;
Expression :
CompareOperator;
CompareOperator returns Expression:
ConditionalOR(( /* {Inclusion.left=current} '='|*/{Equality.left=current}'=='|{NoInclusion.left=current}'!='|{Different.left=current}'<>'|{Inferrior.left=current}'<'|{Superior.left=current}'>'|{SuperiorOrEqual.left=current}'>='|{InferriorOrEqual.left=current}'<=') right=ConditionalOR)*;
ConditionalOR returns Expression:
Addition (({ConditionalOR.left=current} 'or'|{ConditionalOX.left=current} 'ox'|{ConditionalAND.left=current} 'and'|{ConditionalNOT.left=current} 'not') right=Addition)*;
Addition returns Expression:
Multiplication (({Plus.left=current} '+' | {Minus.left=current} '-') right=Multiplication)*;
Multiplication returns Expression:
PrimaryExpression (({Multi.left=current} '*' | {Div.left=current} '/') right=PrimaryExpression)*;
PrimaryExpression returns Expression:
NumericInt|NumericReal|StringLiteral //|Call
| VariableOperande
| '(' Expression ')'
;
StringLiteral:
stringValue=STRING
;
NumericInt:
value=INT;
NumericReal:
value=REAL;
VariableOperande:
variable=[VariableDeclaration]
;
VariableDeclaration:
'dcl' name = ID type=Type //| ('like' variable=[VariableDeclaration]))
('endloc')?('[,S]')?
;
Type:
ShortNumericType | NumericType | StringType | BCDType
;
ShortNumericType:
{ShortNumericType}'#';
NumericType:
{NumericType}'%';
StringType:
{StringType}'$'('='size=INT)?
;
BCDType:
{BCDType}('='size=INT)?;
terminal ID : ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9')*;
terminal INT returns ecore::EInt: ('0'..'9')+;
terminal REAL returns ecore::EDouble : INT '.' INT;
terminal STRING :
'"' ( '\\' ('b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\') | !('\\'|'"') )* '"' |
"'" ( '\\' ('b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\') | !('\\'|"'") )* "'"
;
terminal SL_COMMENT : (';') !('\n'|'\r')* ('\r'? '\n')?;
terminal WS : (' '|'\t'|'\r'|'\n')+;
I have one eror: InternalLanguage.g:80:1: [fatal] rule ruleIfstatement has non-LL(*) decision due to recursive rule invocations reachable from alts 1,2. Resolve by left-factoring or using syntactic predicates or using backtrack=true option.
I don't understand why this grammar it's not good because IfSimpleInstruction and IfSeveralInstruction haven't the same define
Maybe somebody has an idea or can point me into the right direction? Thanks in advance!
Best regards,
Jérôme
|
|
|
Powered by
FUDForum. Page generated in 0.02763 seconds