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"
重现步骤:
- 从 npm 全局安装 jison-gho(或修改代码以使用本地版本)。我使用 Node 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
编辑:更新了一个可重现的例子。
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。
所以这些选项中的任何一个都将实现您期望的行为。
我有以下 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"
重现步骤:
- 从 npm 全局安装 jison-gho(或修改代码以使用本地版本)。我使用 Node 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
编辑:更新了一个可重现的例子。 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。
所以这些选项中的任何一个都将实现您期望的行为。