我现在坐在一个似乎很容易解决的问题面前多个小时,但我不能支持它:/
我在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
发布了完整的语法那么有办法解决这个问题吗?我当然已经尝试使用%left,%right,%assoc和%precedence,但它没有用(或者我做错了什么?
答案 0 :(得分:2)
您在自下而上的解析器中误解了流控制。
当相关产品减少(即完全识别)时执行操作,直到生产中的所有非终端减少后才会发生。
AssignmentStatement
制作是:
AssignStatement
: CHAR_SEQUENCE AssignmentOperator Parameter ';'
因此,在执行相关操作之前,必须执行AssignmentOperator
和Parameter
的制作。在这种情况下,Parameter
与5
匹配。