我有以下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”之类的东西。它适用于“动物类型::猫”之类的东西,但是当它看到狗而不是猫时,它就会发出“做”而不是“id”。我明白它为什么这样做了,但我该如何绕过它呢?我一直在查看其他JISON文档,但似乎找不到(我认为)造成这些工作的不同之处。
这是我得到的错误:
JisonParserError: Parse error on line 1:
PetTypes::dog
----------^
Expecting "ID", "enumstr", "id", got unexpected "DO"复制步骤:
minimal-repro.jisonjison -m es -o ./minimal.mjs ./minimal-repro.jison来创建parsertest.mjs的文件,代码如下:import Parser from "./minimal.mjs";
Parser.parser.parse("PetTypes::dog")运行node test.mjs的
编辑:用一个可复制的例子更新。Edit2:更简单的JISON
发布于 2021-01-06 12:19:50
与(f)lex不同,jison接受第一个匹配模式,即使它不是最长的匹配模式。您可以通过使用
%option flex然而,这大大减慢了扫描仪的速度。
原始jison自动将\b添加到模式的末尾,该模式以匹配字母字符的文字字符串结尾,从而使匹配关键字更容易,而不会产生这种开销。在jison中,除非指定
%option easy_keyword_rules见https://github.com/zaach/jison/wiki/Deviations-From-Flex-Bison#user-content-literal-tokens。
因此,这两种选择都能达到你所期望的行为。
https://stackoverflow.com/questions/65581744
复制相似问题