左递归的问题
Problems with left-recursion
我有一些语法,其中包含一些必须与 Numbers 一起使用的命令以及其中一些命令 return Numbers。
我的语法片段如下所示:
Command:
name Numbers
| Numbers "test"
;
name:
"abs"
| "acos"
;
Numbers:
NUMBER
| numberReturn
;
numberReturn:
name Numbers
;
terminal NUMBER:
('0'..'9')+("."("0".."9")+)?
;
在规则命令中插入 "Numbers 'test'" 部分后,编译器抱怨非 LL() 决策并告诉我必须解决这些问题(左因式分解、句法谓词、回溯)但我的问题是我不知道在这种情况下什么样的输入不会是非 LL() 也不知道如何左因子我的语法(我不知道想打开回溯)。
编辑:
此语法应匹配的几个示例:
abs 3;
acos abs 4; //interpreted as "acos (abs 4)"
acos 3 test; //(acos 3) test
此致
乌鸦
您要实现的语法是左递归的;这意味着解析器不知道如何区分 (acos 10) test
和 acos (10 test)
(没有括号)。但是,您可以给解析器一些提示,让它知道正确的顺序,例如带括号的表达式。
这将是一个有效的 Xtext 语法,带有 test
括号表达式:
grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"
Model
: operations += UnaryOperation*
;
UnaryOperation returns Expression
: 'abs' exp = Primary
| 'acos' exp = Primary
| '(' exp = Primary 'test' ')'
;
Primary returns Expression
: NumberLiteral
| UnaryOperation
;
NumberLiteral
: value = INT
;
解析器将正确识别如下表达式:
- (acos abs (20 测试) 测试)
- acos 腹肌 20
- acos 20
- (20 次测试)
这些文章可能对您有帮助:
我有一些语法,其中包含一些必须与 Numbers 一起使用的命令以及其中一些命令 return Numbers。
我的语法片段如下所示:
Command:
name Numbers
| Numbers "test"
;
name:
"abs"
| "acos"
;
Numbers:
NUMBER
| numberReturn
;
numberReturn:
name Numbers
;
terminal NUMBER:
('0'..'9')+("."("0".."9")+)?
;
在规则命令中插入 "Numbers 'test'" 部分后,编译器抱怨非 LL() 决策并告诉我必须解决这些问题(左因式分解、句法谓词、回溯)但我的问题是我不知道在这种情况下什么样的输入不会是非 LL() 也不知道如何左因子我的语法(我不知道想打开回溯)。
编辑:
此语法应匹配的几个示例:
abs 3;
acos abs 4; //interpreted as "acos (abs 4)"
acos 3 test; //(acos 3) test
此致
乌鸦
您要实现的语法是左递归的;这意味着解析器不知道如何区分 (acos 10) test
和 acos (10 test)
(没有括号)。但是,您可以给解析器一些提示,让它知道正确的顺序,例如带括号的表达式。
这将是一个有效的 Xtext 语法,带有 test
括号表达式:
grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"
Model
: operations += UnaryOperation*
;
UnaryOperation returns Expression
: 'abs' exp = Primary
| 'acos' exp = Primary
| '(' exp = Primary 'test' ')'
;
Primary returns Expression
: NumberLiteral
| UnaryOperation
;
NumberLiteral
: value = INT
;
解析器将正确识别如下表达式:
- (acos abs (20 测试) 测试)
- acos 腹肌 20
- acos 20
- (20 次测试)
这些文章可能对您有帮助: