首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JISON:我如何避免“狗”被解析为“做”?

JISON:我如何避免“狗”被解析为“做”?
EN

Stack Overflow用户
提问于 2021-01-05 15:25:08
回答 1查看 96关注 0票数 1

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

代码语言:javascript
复制
%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文档,但似乎找不到(我认为)造成这些工作的不同之处。

这是我得到的错误:

代码语言:javascript
复制
JisonParserError: Parse error on line 1:
PetTypes::dog
----------^
Expecting "ID", "enumstr", "id", got unexpected "DO"

复制步骤:

  1. 从npm全局安装jison(或修改代码以使用本地版本)。我使用Nodev14.6.0.JISON将上面的JISON保存为minimal-repro.jison
  2. Run:jison -m es -o ./minimal.mjs ./minimal-repro.jison来创建parser
  3. Create --一个名为test.mjs的文件,代码如下:

代码语言:javascript
复制
import Parser from "./minimal.mjs";
Parser.parser.parse("PetTypes::dog")

运行node test.mjs

编辑:用一个可复制的例子更新。Edit2:更简单的JISON

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-06 12:19:50

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

代码语言:javascript
复制
 %option flex

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

原始jison自动将\b添加到模式的末尾,该模式以匹配字母字符的文字字符串结尾,从而使匹配关键字更容易,而不会产生这种开销。在jison中,除非指定

代码语言:javascript
复制
 %option easy_keyword_rules

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

因此,这两种选择都能达到你所期望的行为。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65581744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档