我有一个简单的文件格式,我想用 jison 解析器生成器解析它。该文件可以包含任意顺序和数量的多个表达式。这是解析器的 jison 文件:
/* lexical grammar */
%lex
%%
\s+ /* skip whitespace */
\"(\\.|[^"])*\" return 'STRING'
File\s*Version\s*\: return 'FILEVERSION'
[0-9]+("."[0-9]+)?\b return 'NUMBER'
<<EOF>> return 'EOF'
. return 'INVALID'
/lex
%start expressions
%% /* language grammar */
expressions
: EOF
| e expressions EOF
;
e
: STRING
| FILEID
;
FILEID
: FILEVERSION NUMBER { return $1 + $2; }
;
为简单起见,我将文件缩短为只有字符串和文件 ID 表达式。
我的问题是,如果第二个表达式仅包含一个类似字符串的标记,那么生成的解析器似乎只能识别一个或两个完整的表达式。例如:
文件版本:1.0
将被解析,或
文件版本:1.0“我的字符串”
也会被解析,但是对于
文件版本:1.0“我的字符串”“未解析的字符串”
最后一个字符串不会被解析。
我已经用jison 调试器和jison 页面本身尝试了这段代码,但是两个页面都显示了相同的结果。
我对这个问题的建议是:
- 一些词法分析器错误(正则表达式)
- 一些语法错误(左右递归)
- 解析器中缺少某些操作({ $$ = $1;} 的种类)
- 我想念的其他一些野牛/吉森魔法
我不是那个 ebnf-parser-guru,所以请让你的答案尽可能简单。