我有以下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步骤:
- 从npm全局安装jison-gho(或修改代码以使用本地版本(。我使用节点v14.6.0
- 将上面的JISON保存为
minimal-repro.jison
- 运行:
jison -m es -o ./minimal.mjs ./minimal-repro.jison
以创建解析器 - 创建一个名为
test.mjs
的文件,代码如下:
import Parser from "./minimal.mjs";
Parser.parser.parse("PetTypes::dog")
- 运行
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-内容文字标记。
因此,这两种选择中的任何一种都会达到你所期望的行为。