我现在坐在一个问题面前多个小时,看起来相当简单但解决不了问题,但我不能得到它:/jison规则优先顺序不起作用?
我在jison中定义了一个类似javascript的小语言。问题是参数规则和AssignStatement规则都可以以CHAR_SEQUENCE开头,并且它总是选择参数规则。例如。即使代码是a = 5;
到达throw "reached parameter";
如此看来解析a
作为参数,而不是a = 5;
为AssignStatement
我的语法的相关部分:
Parameter
: InlineVariable
{ $$ = $1; }
| CHAR_SEQUENCE
{ throw "reached parameter"; checkUndefined($1, @1); $$ = vars[$1]; }
;
InlineVariable
: NUMBER
{ $$ = new Runtime.Integer(parseInt($1)); }
| '"' CHAR_SEQUENCE '"'
{ $$ = new Runtime.String($2); }
| FUNCTION '(' ParameterList ')' Statement
{ $$ = new Container($5); }
;
AssignStatement
: CHAR_SEQUENCE AssignmentOperator Parameter ';'
{
$$ = function()
{
if((typeof vars[$1] == 'undefined' && $3 instanceof Runtime.Integer) || (vars[$1] instanceof Container && $3 instanceof Runtime.Integer))
vars[$1] = new Runtime.Integer(0, $1);
else if(typeof vars[$1] == 'undefined' || (vars[$1] instanceof Container && !($3 instanceof Container)))
vars[$1] = $3.constructor.call();
$2(vars[$1], vars[$3]);
}
}
| CHAR_SEQUENCE SingleAssignmentOperator ';'
{
$$ = function()
{
if(typeof vars[$1] == 'undefined')
vars[$1] = new Runtime.Integer(0, $1);
$2(vars[$1]);
};
}
;
我张贴的全语法在https://gist.github.com/M4GNV5/36c2550946c1a1f6ec91
那么有没有办法解决这个问题?我当然是用%左右,%右,%assoc命令和%的优先级已经尝试过,但它没有工作(或我做错了什么?
没有“作业”生产。如果你的意思是'AssignmentStatement',那么我看不到任何'AssignmentStatement'和'Parameter'都是可行的。你究竟看到了什么将你引向你的问题描述? – rici 2015-02-10 21:26:26
是啊对不起我补充AssignStatement 问题是,如果我例如添加一个throw语句到第二个参数规则,它到达这个语句,所以它解析'i = 5;'作为一个参数,而不是一个AssingStatement 我更新了问题 – M4GNV5 2015-02-10 21:58:17
'5'减少到'Parameter'预期;它与'我'无关。我试图在一个答案中解释。 – rici 2015-02-10 22:07:37