jison规则优先不起作用?
jison rule precedence doesnt work?
我现在在一个看起来很容易解决但我无法解决的问题面前坐了好几个小时:/
我正在用 jison 定义一种类似于 javascript 的小型语言。问题是 Parameter 规则和 AssignStatement 规则都(可以)以 CHAR_SEQUENCE 开头,并且它总是选择参数规则。例如。即使代码是 a = 5;
它到达 throw "reached parameter";
所以它似乎将 a
解析为参数而不是 a = 5;
作为 AssignStatement
我语法的相关部分:
Parameter
: InlineVariable
{ $$ = ; }
| CHAR_SEQUENCE
{ throw "reached parameter"; checkUndefined(, @1); $$ = vars[]; }
;
InlineVariable
: NUMBER
{ $$ = new Runtime.Integer(parseInt()); }
| '"' CHAR_SEQUENCE '"'
{ $$ = new Runtime.String(); }
| FUNCTION '(' ParameterList ')' Statement
{ $$ = new Container(); }
;
AssignStatement
: CHAR_SEQUENCE AssignmentOperator Parameter ';'
{
$$ = function()
{
if((typeof vars[] == 'undefined' && instanceof Runtime.Integer) || (vars[] instanceof Container && instanceof Runtime.Integer))
vars[] = new Runtime.Integer(0, );
else if(typeof vars[] == 'undefined' || (vars[] instanceof Container && !( instanceof Container)))
vars[] = .constructor.call();
(vars[], vars[]);
}
}
| CHAR_SEQUENCE SingleAssignmentOperator ';'
{
$$ = function()
{
if(typeof vars[] == 'undefined')
vars[] = new Runtime.Integer(0, );
(vars[]);
};
}
;
我在 https://gist.github.com/M4GNV5/36c2550946c1a1f6ec91
发布了完整的语法
那么有没有办法解决这个问题呢?我当然已经尝试过使用 %left、%right、%assoc 和 %precedence 但它没有用(或者我做错了什么?
您误解了自底向上解析器中的流程控制。
当关联产生式减少(即完全识别)时执行操作,直到产生式中的所有非终端都减少后才会发生。
AssignmentStatement
产量是:
AssignStatement
: CHAR_SEQUENCE AssignmentOperator Parameter ';'
因此,在执行相关操作之前,必须执行 AssignmentOperator
和 Parameter
的产生式。在这种情况下,Parameter
匹配 5
.
我现在在一个看起来很容易解决但我无法解决的问题面前坐了好几个小时:/
我正在用 jison 定义一种类似于 javascript 的小型语言。问题是 Parameter 规则和 AssignStatement 规则都(可以)以 CHAR_SEQUENCE 开头,并且它总是选择参数规则。例如。即使代码是 a = 5;
它到达 throw "reached parameter";
所以它似乎将 a
解析为参数而不是 a = 5;
作为 AssignStatement
我语法的相关部分:
Parameter
: InlineVariable
{ $$ = ; }
| CHAR_SEQUENCE
{ throw "reached parameter"; checkUndefined(, @1); $$ = vars[]; }
;
InlineVariable
: NUMBER
{ $$ = new Runtime.Integer(parseInt()); }
| '"' CHAR_SEQUENCE '"'
{ $$ = new Runtime.String(); }
| FUNCTION '(' ParameterList ')' Statement
{ $$ = new Container(); }
;
AssignStatement
: CHAR_SEQUENCE AssignmentOperator Parameter ';'
{
$$ = function()
{
if((typeof vars[] == 'undefined' && instanceof Runtime.Integer) || (vars[] instanceof Container && instanceof Runtime.Integer))
vars[] = new Runtime.Integer(0, );
else if(typeof vars[] == 'undefined' || (vars[] instanceof Container && !( instanceof Container)))
vars[] = .constructor.call();
(vars[], vars[]);
}
}
| CHAR_SEQUENCE SingleAssignmentOperator ';'
{
$$ = function()
{
if(typeof vars[] == 'undefined')
vars[] = new Runtime.Integer(0, );
(vars[]);
};
}
;
我在 https://gist.github.com/M4GNV5/36c2550946c1a1f6ec91
发布了完整的语法那么有没有办法解决这个问题呢?我当然已经尝试过使用 %left、%right、%assoc 和 %precedence 但它没有用(或者我做错了什么?
您误解了自底向上解析器中的流程控制。
当关联产生式减少(即完全识别)时执行操作,直到产生式中的所有非终端都减少后才会发生。
AssignmentStatement
产量是:
AssignStatement
: CHAR_SEQUENCE AssignmentOperator Parameter ';'
因此,在执行相关操作之前,必须执行 AssignmentOperator
和 Parameter
的产生式。在这种情况下,Parameter
匹配 5
.