当前位置: 首页 > 知识库问答 >
问题:

具有冲突标记的ANTLR行为

方宁
2023-03-14

在令牌冲突的情况下,如何定义ANTLR lexer行为?让我解释一下“冲突”标记的含义。例如,假设定义了以下内容:

INT_STAGE       :   '1'..'6';
INT             :   '0'..'9'+;

这里有一个冲突,因为在读取一系列数字后,lexer将不知道是有一个INT还是多个INT\u阶段标记(或两者的不同组合)。测试之后,如果INT是在INT\u阶段之后定义的,那么lexer会更喜欢查找INT\u阶段,但可能不是INT?否则,将找不到INT\u阶段。

另一个例子是:

FOOL: ' fool'
FOO: 'foo'
ID              :   ('a'..'z'|'A'..'Z'|'_'|'%') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'%')*;

我被告知,这是识别所有标记的“正确”顺序:当阅读“傻瓜”时,lexer将找到一个傻瓜标记,而不是FOO-ID或其他东西。

共有1个答案

梁嘉澍
2023-03-14

以下逻辑适用:

  1. 词法分析器匹配尽可能多的字符
  2. 如果在应用规则1后,有2个或更多规则匹配相同数量的字符,则首先定义的规则将“获胜”

考虑到这一点,输入"1""2",...,"6"被标记为INT_STAGEINT_STAGEINT匹配相同数量的字符,但INT_STAGE首先定义。

输入"12"被标记为INT,因为它匹配的字符最多。

我被告知,这是识别所有标记的“正确”顺序:当阅读“傻瓜”时,lexer将找到一个傻瓜标记,而不是FOO-ID或其他东西。

这是正确的。

 类似资料:
  • 使用: 所有类都在中生成,在中没有类。没有-p开关,所有xsd都是在它们自己的默认包中生成的。但无法告诉wsimport为每个XSD使用特定的包。现在我使用以下绑定文件,这可能是不正确的,但wsimport对此没有抱怨: 在包org.broker.wsi.b_2和org.broker.wsi.t_1中,不生成任何文件。 欢迎提出建议。

  • Postgres 10和11的插入说明: 关于冲突[冲突目标]冲突行动 我有一张桌子: 而我想做的 但是我得到一个错误: ON CONFLICT DO UPDATE需要推理规范或约束名称提示:例如,ON CONFLICT(column_name) 为什么我必须提供一个确定的目标?如何提供主键或其他列集?

  • 我正在使用Dagger,我有一个应用程序组件和一个子组件,分别具有范围和范围。现在,当我编译它时,我得到了以下错误: [io.droid.nowtellapp.dagger.SignInMvpComponet]io.droid.nowtellapp.dagger.SignInMvpComponet具有冲突的作用域:io.droid.nowtellapp.dagger.Application ati

  • 这里是我需要完成的,但是我刚开始哈希&甚至不知道从哪里开始。有人能帮帮我吗? 对由5个字符(A-Z和A-Z中的字符)组成的文本词设计一个名为Bailando的哈希函数。 提供一个算法(一组操作)来生成哈希函数的输出。尝试提出一个看起来没有冲突的哈希设计。 什么是基于您的设计的Bailando(“hello”)、Bailando(“three”)和Bailando(“olleh”)。 是否可以在哈希

  • 目前正在运行9.5.3版本。当然,计划更新。 我有一个PostgreSQL数据库,其模式早于表行级安全性(即)。行级安全性是使用视图实现的。在视图中,只选择所有者名称与当前用户匹配的行来实现安全性。 我正试图使用这样一个视图构建一个upsert查询。当我试图命名

  • 我有以下格式化程序: 就我对文档的理解而言,它应该只在没有解析值的情况下尝试替换默认值。似乎这工作的月份,因为我有不同的月份与默认的一个分析。然而,它多年来都不起作用。 我用错了吗?有人能告诉我是否有不同的方法来定义模式中可能不存在的字段的默认值吗?