我正在编写一个简单的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);};测试输入如下:
5-10,12-16产出如下:
Parse error on line 1:
5-10,12-16
^
Expecting '-', 'EOF', ',', got '8'如果它把'a‘放在前面,我会得到和预期的错误,发现“无效”,但我没有一个"8“的输入字符串,所以我想知道这是否是一个内部状态?
我正在使用在线解析器生成器:http://zaach.github.io/jison/try/
有什么想法?
发布于 2013-11-14 15:12:18
这个产品让Jison很困惑(我也很困惑: ):
NUMBER: {$$ = Number(yytext);};NUMBER应该是一个终端,但是上面的产品将它声明为一个空体的非终端。因为它不能匹配任何东西,所以它立即匹配,并且语法不允许连续两个NUMBER。因此出现了错误。
此外,您的语法也是模棱两可的,尽管我认为Jison的默认值将解决这个问题。不过,最好是直截了当,因为这很容易。你的规则:
e : rng
| e ',' e没有指定,“关联”的方式:换句话说,rng , rng , rng应该被看作是e , rng还是rng , e。第一个可能对您更好,因此您应该显式地编写它:
e : rng
| e ',' rng上面的一个优点是您不需要在第二个产品中创建一个新的数组;您可以将$3推到$1的末尾,并将$$设置为$1。
https://stackoverflow.com/questions/19980853
复制相似问题