jison规则的优先级不起作用

jison rule precedence doesnt work?

本文关键字:不起作用 优先级 规则 jison      更新时间:2023-09-26

我现在坐了好几个小时,面对一个看似很简单但却无法解决的问题:/

我在jison中定义了一个类似javascript的小语言。问题是Parameter规则和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和%priorience,但没有成功(或者我做错了什么?

您误解了自下而上解析器中的流控制。

当相关产量减少(即完全识别)时执行操作,直到生产中的所有非终端都减少后才会发生。

AssignmentStatement的生产是:

AssignStatement
    : CHAR_SEQUENCE AssignmentOperator Parameter ';'

因此,在执行其关联的操作之前,必须执行AssignmentOperatorParameter的生产。在这种情况下,Parameter5相匹配。