gpt4 book ai didi

javascript - jison 规则优先不起作用?

转载 作者:行者123 更新时间:2023-12-02 16:29:20 25 4
gpt4 key购买 nike

我现在在一个看起来很容易解决的问题面前坐了几个小时,但我就是无法解决它:/

我正在 jison 中定义一种小型的类似 javascript 的语言。问题是参数规则和AssignStatement 规则都可以以CHAR_SEQUENCE 开头,并且它始终选择参数规则。例如。即使代码是a = 5;,它也会到达抛出“到达参数”;,因此它似乎将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 但它不起作用(或者我做错了什么?

最佳答案

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

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

AssignmentStatement 的产生式是:

AssignStatement
: CHAR_SEQUENCE AssignmentOperator Parameter ';'

因此,在执行其关联操作之前,必须执行 AssignmentOperatorParameter 的产生式。在本例中,Parameter5 匹配。

关于javascript - jison 规则优先不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28441107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com