【发布时间】:2015-11-27 05:52:25
【问题描述】:
我有一个简单的文件格式,我想用 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 debugger 和jison page 本身上尝试过这段代码,但两个页面显示的结果相同。
我对这个问题的建议是:
- 一些词法分析器错误(正则表达式)
- 一些语法错误(左右递归)
- 解析器中缺少某些操作({ $$ = $1;} 的种类)
- 我还缺少其他一些野牛/吉森魔法
我不是那个 ebnf-parser-guru,所以请让你的答案尽可能简单。
【问题讨论】:
标签: javascript regex parsing ebnf jison