0

我有这个 Jison 词法分析器和解析器:

%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。我错过了什么?

4

1 回答 1

2

与 (f)lex 不同——或者,事实上,绝大多数扫描仪生成器,jison 扫描仪不实施最长匹配规则。相反,第一个匹配模式获胜。

为了使这项工作适用于关键字,jison 扫描器还实现了简单文字字符串(如“D01”)仅在它们以单词边界结尾时才匹配的限制。

解决方法是用多余的括号括起来文字字符串模式:

("D01")       { return 'D01'; }

这记录在jison wiki

于 2015-08-06T18:28:43.767 回答