gpt4 book ai didi

javascript - 使用简单的 jison 语法解析错误

转载 作者:行者123 更新时间:2023-12-03 10:51:08 25 4
gpt4 key购买 nike

我正在尝试创建一种简单的脚本语言。一开始我只是想要类似的东西

i = 5;
i += 3;
out(i);

所以我为 jison 创建了以下语法:

%lex
%%

\s+ { /* ignore */ }

"=" { return '='; }
"+=" { return '+='; }
"-=" { return '-='; }
"*=" { return '*='; }
"/=" { return '/='; }

"." { return '.'; }
"(" { return '('; }
")" { return ')'; }
"{" { return '{'; }
"}" { return '}'; }

[0-9]+ { return 'NUMBER'; }
[A-Z]* { return 'CHAR_SEQUENCE'; }

<<EOF>> { return 'EOF'; }

/lex

%%

Program
: StatementList EOF
{
return function()
{
for(var i = 0; i < $1.length; i++)
{
$1[i]();
}
};
}
;

StatementList
: StatementList Statement
{ $$ = $1.concat($2); }
|
{ $$ = []; }
;

Statement
: AssignStatement
| VariableOutput
;

Operator
: "="
{ $$ = function(left, right) { left.set(right); }; }
| "+="
{ $$ = function(left, right) { left.add(right); }; }
| "-="
{ $$ = function(left, right) { left.remove(right); }; }
| "*="
{ $$ = function(left, right) { left.multiplicate(right); }; }
| "/="
{ $$ = function(left, right) { left.divide(right); }; }
;


VariableOutput
: 'out(' CHAR_SEQUENCE ')' ';'
{
$$ = function()
{
var t = new Tellraw("Output: ");
t.extra.push(vars[$1].toTellrawExtra());
t.tell(new Entities.Player("@a"));
};
}
;

AssignStatement
: CHAR_SEQUENCE Operator CHAR_SEQUENCE ';'
{
$$ = function()
{
Util.assert(typeof vars[$3] != 'undefined', "Unknown identifier '"+$3+"'");

if(typeof vars[$1] == 'undefined')
vars[$1] = vars[$3].constructor.call();

$2(vars[$1], vars[$3]);
};
}
| CHAR_SEQUENCE Operator '"' CHAR_SEQUENCE '"' ';'
{
$$ = function()
{
if(typeof vars[$1] == 'undefined')
vars[$1] = new Runtime.String($3);

$2(vars[$1], $3);
};
}
| CHAR_SEQUENCE Operator NUMBER ';'
{
$$ = function()
{
if(typeof vars[$1] == 'undefined')
vars[$1] = new Runtime.Integer($3);

$2(vars[$1], $3);
};
}
;

它生成解析器而不提示语法。我的问题是当我这样做时

parser.parse('i=5;out(i);')();

我收到此错误

Parse error on line 1:
i = 5;out(i);
^
Expecting '=', '+=', '-=', '*=', '/=', got 'CHAR_SEQUENCE'

这让我完全困惑:/没有任何规则要求首先使用运算符。唯一需要运算符的规则是赋值语句,但它们都需要 CHAR_SQUENCE 作为第一个对象。

我做错了什么吗?或者为什么它不起作用?如果您需要任何进一步的信息,请随时询问:)

最佳答案

您期望 iCHAR_SEQUENCE,但 CHAR_SEQUENCE[A-Z]*,即比如说,只有大写字母。您可能想要类似 [A-Za-z_][A-Za-z_0-9]* 的内容。因此词法分析器根本无法识别 i

但是,它正在识别一个空的 CHAR_SEQUENCE。在 jison 中,与 flex 不同,可以匹配空字符串的模式会这样做,并且几乎应该始终避免。

关于javascript - 使用简单的 jison 语法解析错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28413452/

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