我正在编写一个简单的 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”,我会得到关于查找“INVALID”的预期错误,但我在输入字符串中没有“8”,所以我想知道这是否是内部状态?
我正在使用在线解析器生成器:http: //zaach.github.io/jison/try/
想法?