Javascript Jison语法问题,生成dparser时出现奇怪错误

Javascript Jison语法问题,生成dparser时出现奇怪错误,javascript,parsing,grammar,jison,Javascript,Parsing,Grammar,Jison,我正在写一个简单的Jison语法,以便在开始一个更复杂的项目之前获得一些经验。我尝试了一种简单的语法,它是一个逗号分隔的数字范围列表,其中的范围的起始值和结束值是相同的,可以使用单个数字速记。然而,当在一些测试输入上运行生成的解析器时,我得到了一个错误,这对我来说毫无意义。以下是我提出的语法: /* description: Parses end executes mathematical expressions. */ /* lexical grammar */ %lex %% \s+

我正在写一个简单的Jison语法,以便在开始一个更复杂的项目之前获得一些经验。我尝试了一种简单的语法,它是一个逗号分隔的数字范围列表,其中的范围的起始值和结束值是相同的,可以使用单个数字速记。然而,当在一些测试输入上运行生成的解析器时,我得到了一个错误,这对我来说毫无意义。以下是我提出的语法:

/* description: Parses end executes mathematical expressions. */

/* lexical grammar */
%lex
%%

\s+                   /* skip whitespace */
[0-9]+                {return 'NUMBER'}
"-"                   {return '-'}
","                   {return ','}
<<EOF>>               {return 'EOF'}
.                     {return 'INVALID'}

/lex

/* operator associations and precedence */

%start ranges

%% /* language grammar */

ranges
    : e EOF
        {return $1;}
    ;

e   :  rng { $$ = $1;}
    | e ',' e {alert('e,e');$$ = new Array(); $$.push($1); $$.push($3);}
    ;

rng
    : NUMBER '-' NUMBER
        {$$ = new Array(); var rng = {Start:$1, End: $3; }; $$.push(rng); }
    | NUMBER
        {$$ = new Array(); var rng = {Start:$1, End: $1; }; $$.push(rng);}
    ;

NUMBER: {$$ = Number(yytext);};
输出为:

Parse error on line 1:
5-10,12-16
^
Expecting '-', 'EOF', ',', got '8'
如果它在前面加了一个“a”,我会得到一个关于查找“INVALID”的错误,但是我在输入字符串中没有一个“8”,所以我想知道这是否是一个内部状态

我正在以下位置使用联机解析器生成器:


想法

这部作品让吉森很困惑(我也很困惑:):

NUMBER
应该是一个终端,但上面的产品声明它是一个非终端,主体为空。因为它不能匹配任何东西,所以它会立即匹配,并且您的语法不允许两个连续的
NUMBER
s。因此出现了错误

另外,您的语法是不明确的,尽管我认为Jison的默认设置可以解决这个问题。不过,最好是直截了当,因为这很容易。你的规则:

e   : rng 
    | e ',' e
不指定如何
“关联”:换句话说,是否应将
rng、rng、rng
视为
e、rng
rng、e
。第一个可能更适合您,因此您应该明确地编写它:

e   :  rng
    |  e ',' rng

上述方法的一大优点是,您不需要在第二次生产中创建新阵列;您只需将
$3
推到
$1
的末尾,并将
$
设置为
$1

当我尝试您的语法时,我报告了一个移位/减少冲突。我认为“8”表示“令牌类型8”,即“数字”。而且看起来您试图将“数字”用作终端符号和非终端符号。我认为这不好。这两条评论都有效,我的javascript还有另一个问题,但我可以自己追踪。我本来打算发布最后的工作语法,但是太长了,无法发表评论。
e   : rng 
    | e ',' e
e   :  rng
    |  e ',' rng