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

  • 本文关键字:do dog 何避免 JISON jison
  • 更新时间 :
  • 英文 :


我有以下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: $1, val: $3}}
;

它用于解析类似于";动画类型::cat"。它适用于";AnimalTypes::cat";,但当它看到狗而不是猫时,它就认为这是一个DO而不是id。我明白它为什么这么做,但我该如何绕过它?我一直在看其他的JISON文件,但似乎没有发现(我想(使这些文件起作用的区别。

这是我得到的错误:

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

Repro步骤:

  1. 从npm全局安装jison-gho(或修改代码以使用本地版本(。我使用节点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

编辑:更新为可复制的示例。第2版:更简单的杰森

与(f(lex不同,jison lexer接受第一个匹配模式,即使它不是最长的匹配模式。使用可以获得(f(lex行为

%option flex

然而,这会大大减慢扫描仪的速度。

最初的jison自动将b添加到以匹配字母字符的文字字符串结束的模式的末尾,以使匹配关键字更容易,而不会产生这种开销。在jison gho中,除非您指定,否则此功能将被关闭

%option easy_keyword_rules

请参阅https://github.com/zaach/jison/wiki/Deviations-From-Flex-Bison#user-内容文字标记。

因此,这两种选择中的任何一种都会达到你所期望的行为。

相关内容

  • 没有找到相关文章

最新更新