删除 xtext 中的左递归
Removing left recursion in xtext
我看了很多这方面的帖子,还阅读了 https://eclipse.org/Xtext/documentation/307_special_languages.html, as well as https://typefox.io/parsing-expressions-with-xtext
中的 Parsing Expressions with Xtext
但是,我无法消除我的 LL 递归错误:
我的语法是:
能够解决除一个问题以外的所有问题
Trailer:
'[' (index+=Expr)?']'|
'(' (params+=Expr_list)? ')'|
'.' name=id(trailer+=Trailer)* //TODO fix left recusion
;
尝试了以下
Trailer:
TerminalTrailer |
'.' name=id (trailer+=TerminalTrailer )* //TODO fix left recusion
TerminalTrailer returns Trailer:
'[' (index+=Expr)?']'|
'(' (params+=Expr_list)? ')';
但是这是行不通的,我有点不明白为什么,它也没有说明这种情况。 name (Trailer) 其中 trailer 是另一个 .姓名
有什么想法吗?
这些表达式在 Xtext 中看起来像下面的表达式
Addition returns Expression:
Multiplication ({Addition.left=current} '+' right=Multiplication)*;
Multiplication returns Expression:
Primary ({Multiplication.left=current} '*' right=Primary)*;
Primary returns Expression:
NumberLiteral |
'(' Addition ')';
NumberLiteral:
value=INT;
请参阅 http://typefox.io/parsing-expressions-with-xtext for a detailed explanation. and https://github.com/LorenzoBettini/xsemantics/blob/master/examples/it.xsemantics.example.expressions/src/it/xsemantics/example/expressions/Expressions.xtext 了解更复杂的示例
更新:
你的东西可能是这样的(未经测试)
OrExpression:
And_expr ({OrExpression.left=current} '||' right+=And_expr)*;
And_expr returns Expression:
Subtract_expr ({And_expr.left=current} '&&' right+=Subtract_expr)*;
Subtract_expr returns Expression:
"!" not=Subtract_expr
| Compare_expr;
Compare_expr returns Expression:
Math_expr (operator+=('>=' | '<=' | '==' | '!=' | '>' | '<') comp+=Math_expr)+ |
'(' Compare_expr ')' | //
Literal;
Literal returns Expression:
{Literal}(
value?="true" | "false");
Math_expr:
valie=INT;
编辑 2:
Trailer:
'[' (index+=Expr)?']'|
'(' (params+=Expr_list)? ')'|
'.' name=ID (=>trailer+=Trailer)*
;
我看了很多这方面的帖子,还阅读了 https://eclipse.org/Xtext/documentation/307_special_languages.html, as well as https://typefox.io/parsing-expressions-with-xtext
中的 Parsing Expressions with Xtext但是,我无法消除我的 LL 递归错误:
我的语法是:
能够解决除一个问题以外的所有问题
Trailer:
'[' (index+=Expr)?']'|
'(' (params+=Expr_list)? ')'|
'.' name=id(trailer+=Trailer)* //TODO fix left recusion
;
尝试了以下
Trailer:
TerminalTrailer |
'.' name=id (trailer+=TerminalTrailer )* //TODO fix left recusion
TerminalTrailer returns Trailer:
'[' (index+=Expr)?']'|
'(' (params+=Expr_list)? ')';
但是这是行不通的,我有点不明白为什么,它也没有说明这种情况。 name (Trailer) 其中 trailer 是另一个 .姓名
有什么想法吗?
这些表达式在 Xtext 中看起来像下面的表达式
Addition returns Expression:
Multiplication ({Addition.left=current} '+' right=Multiplication)*;
Multiplication returns Expression:
Primary ({Multiplication.left=current} '*' right=Primary)*;
Primary returns Expression:
NumberLiteral |
'(' Addition ')';
NumberLiteral:
value=INT;
请参阅 http://typefox.io/parsing-expressions-with-xtext for a detailed explanation. and https://github.com/LorenzoBettini/xsemantics/blob/master/examples/it.xsemantics.example.expressions/src/it/xsemantics/example/expressions/Expressions.xtext 了解更复杂的示例
更新:
你的东西可能是这样的(未经测试)
OrExpression:
And_expr ({OrExpression.left=current} '||' right+=And_expr)*;
And_expr returns Expression:
Subtract_expr ({And_expr.left=current} '&&' right+=Subtract_expr)*;
Subtract_expr returns Expression:
"!" not=Subtract_expr
| Compare_expr;
Compare_expr returns Expression:
Math_expr (operator+=('>=' | '<=' | '==' | '!=' | '>' | '<') comp+=Math_expr)+ |
'(' Compare_expr ')' | //
Literal;
Literal returns Expression:
{Literal}(
value?="true" | "false");
Math_expr:
valie=INT;
编辑 2:
Trailer:
'[' (index+=Expr)?']'|
'(' (params+=Expr_list)? ')'|
'.' name=ID (=>trailer+=Trailer)*
;