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

标签 javascript parsing grammar jison

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

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/

相关文章:

javascript - 在哪里可以找到 ECMAscript/Actionscript/Javascript 的 yacc 语法

java - Antlr树语法

javascript - 无法加载 ui.bootstrap 模块

ios - 在iOS中解析Json而没有常见的 key

parsing - Grails中的Web爬网程序可计算页面深度

date - Golang time.Parse 定义新格式类型

javascript - node-red - 自定义节点 - 发生事件时动态更新 HTML 表单

javascript - readstream在nodejs中将文件存储在哪里

javascript - 你如何获得裁判的姓名?

nlp - 用 NLTK 检查英语语法