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