我有这个Jison lexer和解析器:
%lex
%%
\s+ /* skip whitespace */
'D01' return 'D01'
[xX][+-]?[0-9]+ return 'COORD'
<<EOF>> return 'EOF'
. return 'INVALID'
/lex
%start source
%%
source
: command EOF;
command
: D01 COORD;
它会标记并解析D01 X45
但不会D01X45
。我错过了什么?
答案 0 :(得分:2)
与(f)lex - 或者实际上绝大多数扫描仪生成器不同,jison扫描仪不实现最长匹配规则。相反,第一个匹配模式获胜。
为了使这个功能适用于关键字,jison扫描仪还实现了简单文字字符串的限制 - 比如&#34; D01&#34; - 只有在字边界结束时才匹配。
解决方法是将带有多余括号的文字字符串模式括起来:
("D01") { return 'D01'; }
中记录了这一点