JISON:如何避免 "dog" 被解析为 "do"?

JISON: How do I avoid "dog" being parsed as "do"?

我有以下 JISON 文件(我的实际文件的精简版,但重现了我的问题):

%lex

%%

"do"                        return 'DO';
[a-zA-Z_][a-zA-Z0-9_]*      return 'ID';
"::"                        return 'DOUBLECOLON'
<<EOF>>                     return 'ENDOFFILE';

/lex

%%

start
    : ID DOUBLECOLON ID ENDOFFILE
    {$$ = {type: "enumval", enum: , val: }}
    ;

它用于解析类似“AnimalTypes::cat”的内容。它适用于“AnimalTypes::cat”之类的东西,但是当它看到狗而不是猫时,它会认为它是一个 DO 而不是一个 id。我明白为什么会这样,但我该如何解决呢?我一直在查看其他 JISON 文档,但似乎无法发现(我假设)使这些文件起作用的区别。

这是我得到的错误:

JisonParserError: Parse error on line 1:
PetTypes::dog
----------^
Expecting "ID", "enumstr", "id", got unexpected "DO"

重现步骤:

  1. 从 npm 全局安装 jison-gho(或修改代码以使用本地版本)。我使用 Node v14.6.0.
  2. 将上面的JISON保存为minimal-repro.jison
  3. 运行: jison -m es -o ./minimal.mjs ./minimal-repro.jison 创建解析器
  4. 创建一个名为 test.mjs 的文件,代码如下:
import Parser from "./minimal.mjs";
Parser.parser.parse("PetTypes::dog")
  1. 运行 node test.mjs

编辑:更新了一个可重现的例子。 Edit2:更简单的 JISON

与 (f)lex 不同,jison 词法分析器接受第一个匹配模式,即使它不是最长的匹配模式。您可以使用

获得 (f)lex 行为
 %option flex

但是,这会显着降低扫描仪的速度。

原始 jison 自动将 \b 添加到以匹配字母字符的文字字符串结尾的模式末尾,以便更容易匹配关键字而不会产生这种开销。在 jison-gho 中,此功能已关闭,除非您指定

 %option easy_keyword_rules

https://github.com/zaach/jison/wiki/Deviations-From-Flex-Bison#user-content-literal-tokens

所以这些选项中的任何一个都将实现您期望的行为。