为什么 ANTLR4 不匹配单词“of”和标点符号“,”?

2024-01-09

我有一个Hello.g4带有语法定义的语法文件:

definition : wordsWithPunctuation ;
words : (WORD)+ ;
wordsWithPunctuation : word ( word | punctuation word | word punctuation | '(' wordsWithPunctuation ')' | '"' wordsWithPunctuation '"' )*  ;
NUMBER : [0-9]+ ;
word : WORD ;
WORD : [A-Za-z-]+ ;
punctuation : PUNCTUATION ;
PUNCTUATION : (','|'!'|'?'|'\''|':'|'.') ;
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines

现在,如果我尝试从以下输入构建解析树:

a b c d of at of abc bcd of
a b c d at abc, bcd
a b c d of at of abc, bcd of

它返回错误:

Hello::definition:1:31: extraneous input 'of' expecting {<EOF>, '(', '"', WORD, PUNCTUATION}

虽然:

a b c d  at:  abc bcd!

工作正常。

语法、输入或解释器有什么问题?

如果我修改wordsWithPunctuation规则,通过添加(... | 'of' | ',' word | ...)然后它完全匹配输入,但它对我来说看起来很可疑 - 这个词如何of和这个词不一样a or abc?或者为什么,与其他不同punctuation字符(即为什么它匹配: or !, 但不是,?)?

Update1:

我正在使用 Eclipse 的 ANTLR4 插件,因此项目构建会产生以下输出:

ANTLR Tool v4.2.2 (/var/folders/.../antlr-4.2.2-complete.jar)
Hello.g4 -o /Users/.../eclipse_workspace/antlr_test_project/target/generated-sources/antlr4 -listener -no-visitor -encoding UTF-8

Update2:

上面给出的语法只是以下语法的一部分:

grammar Hello;

text : (entry)+ ;

entry : blub 'abrr' '-' ('1')? '.' ('(' NUMBER ')')? sims '-' '(' definitionAndExamples ')' 'Hello' 'all' 'the' 'people' 'of' 'the' 'world';

blub : WORD ;

sims : sim (',' sim)* ;
sim : words ;

definitionAndExamples : definitions (';' examples)? ;

definitions : definition (';' definition )* ;
definition : wordsWithPunctuation ;

examples : example (';' example )* ;
example : '"' wordsWithPunctuation '"' ;

words : (WORD)+ ;
wordsWithPunctuation : word ( word | punctuation word | word punctuation | '(' wordsWithPunctuation ')' | '"' wordsWithPunctuation '"' )*  ;

NUMBER : [0-9]+ ;
word : WORD ;
WORD : [A-Za-z-]+ ;
punctuation : PUNCTUATION ;
PUNCTUATION : (','|'!'|'?'|'\''|':'|'.') ;
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines

现在我看来,来自entry规则以某种方式打破了其他规则entry规则。但为什么?它是语法中的一种反模式吗?


通过包括'of'在解析器规则中,ANTLR 创建一个隐式匿名标记来表示该输入。这个单词of将始终具有该特殊令牌类型,因此它永远不会具有该类型WORD。它可能出现在解析树中的唯一位置是'of'出现在解析器规则中。

您可以通过将语法分离为单独的语法来阻止 ANTLR 创建这些匿名标记类型lexer grammar HelloLexer in HelloLexer.g4 and parser grammar HelloParser in HelloParser.g4。我强烈推荐你always使用此表格的原因如下:

  1. 仅当您这样做时,词法分析器模式才有效。
  2. 隐式定义的标记是语法中最常见的错误来源之一,分离语法可以防止这种情况发生。

一旦你将语法分开,你就可以更新你的word允许特殊标记的解析器规则of被视为一个词。

word
  : WORD
  | 'of'
  | ... other keywords which are also "words"
  ;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 ANTLR4 不匹配单词“of”和标点符号“,”? 的相关文章

随机推荐

  • React Native开发服务器返回响应错误代码500

    错误 捆绑失败 错误 无法解析模块 react transform hmr lib index js from P React Native TryReactNative App js 模块 react transform hmr lib
  • ExponentialBackoffRetry 如何与 Azure 函数的 ServiceBus 触发器配合使用?

    我想在我的Azure函数中实现一个非常简单的行为 如果在处理过程中出现异常 我想推迟下一次重试一段时间 据我所知 在服务总线中没有直接的可能性 例如 除非创建一条新消息 但服务总线触发器有可能ExponentialBackoffRetry
  • “mean_squared_error”的负值

    我正在使用 scikit 并使用mean squared error作为 cross val score 中模型评估的评分函数 rms score cross validation cross val score model X y cv
  • 将多个列表 传递到 ArrayAdapter

    我从 活动 中开始 adapter new ItemAdapter Items this items totals setListAdapter adapter 现在这是 ItemAdapter public class ItemAdapt
  • 如何打开.sqlite-wal

    我想从 Mac 应用程序导出我的 Shazamed 标签 该应用程序不提供任何导出选项 Mac 版 Shazam 将它们存储在 sqlite 3 数据库中 该应用程序正在生成 3 个文件 ShazamDataModel sqlite Sha
  • 如何使用 MinGW 在 Windows 中构建 Google 的 protobuf?

    我使用 Code Blocks 作为 MingW 的 IDE 我正在尝试使用谷歌协议缓冲区 但我在构建 protobuf 时遇到了麻烦 protobuf 的自述文件说 如果您使用 Cygwin 或 MinGW 按照上面的 Unix 安装说明
  • 从 Netbeans 项目中删除文件,但不从硬盘中删除文件

    我的项目文件夹中有很多文件 但我不想将它们全部放在我的 Netbeans 项目中 Netbeans 还会使用更多内存和时间自动扫描它们 有没有办法从 Netbeans 项目中排除文件 文件夹 使用 Netbeans 7 3 的解决方案 在
  • 如何在 jquery 中创建查询字符串?

    我被困在这个问题上 我想在动态过滤器上创建查询字符串 现在我已经添加了过滤器类型Select your favorite sports and Select your favorite food 所以将来将会有更多的过滤器 并且只会出现在复
  • 创建 UNIX shell

    我想为 UNIX 创建一个迷你 shell 只是为了了解一切的来龙去脉 我对过去认为理所当然的事情有些困惑 这是一个有点哲学的问题 当我创建一个 shell 时 我假设我有一个没有 shell 的 UNIX 那么在这种情况下 std in
  • 串行或并行:Robo 测试实验室的设备测试顺序

    当我在 Robo 测试实验室上使用多个物理设备运行测试配置时 从 firebase 控制台或通过将应用程序上传到 Play 商店 这些设备是并行运行还是串行运行 如果设备并行运行 由于测试设备之间共享相同的设置参数 我的机器人设置脚本将无法
  • 在 Windows 与 Mac 上更改 ggplot2 中的字体

    我在 Mac 上使用 ggplot2 创建了一个绘图 我将字体更改为 Times New Roman 效果很好 library extrafont ggplot data df stat density aes x R1 colour rh
  • 将查找和替换对话框重置为 Visual Studio 中的当前文档

    有没有办法在 Visual Studio 中强制 查找 和 替换 对话框自动选择当前文件在 查找范围 下拉列表中 它应该仅在重新打开对话框时执行此操作 我经常忘记从整个解决方案或项目切换回来 最终浪费了大量时间等待 VS 搜索包括设计器文件
  • Kotlin 1.2.50 要求提供 baseFeatureInfoDir

    当我切换 Android 项目时 classpath com android tools build gradle 3 2 0 alpha18 to classpath org jetbrains kotlin kotlin gradle
  • 在 Java 中复制数据的更快方法?

    我接到一项从服务器复制数据的任务 我在用BufferedInputStream和输出流来复制数据 我正在逐字节地进行 尽管它正在运行 但复制数据需要很长时间 因为其中一些数据有 100 MB 所以它肯定不会工作 任何人都可以建议我使用逐字节
  • 在 xsd 中定义 xml,其中属性决定可能的内容

    如何在 xsd 中定义这样的东西
  • vim中ctrl-v粘贴时如何输入^M

    我的vim使用ctrl v是粘贴快捷方式 这与需要ctrl v作为快捷方式前缀的命令冲突 例如 M need ctrl v ctrl m 我可以在 vim 命令行中执行此操作 并且无需初始化即可在 vim 中执行此操作 但该符号不会从 vi
  • SQL JOIN 查找没有特定值的匹配记录的记录

    我正在尝试加快几年前为雇主的购买授权应用程序编写的一些代码的速度 基本上我有一个慢子查询 我想用 JOIN 替换它 如果它更快 当主管登录应用程序时 他会看到他尚未授权或拒绝的购买请求列表 该列表是通过以下查询生成的 SELECT FROM
  • numpy 唯一且不排序[重复]

    这个问题在这里已经有答案了 如何使用 numpy unique 而不对结果进行排序 而只是按照它们在序列中出现的顺序进行排序 像这样的东西吗 a 4 2 1 3 1 2 3 4 np unique a 4 2 1 3 而不是 np uniq
  • 使用 OpenCV 查找灰度图像中的局部最大值

    有谁知道如何找到灰度中的局部最大值IPL DEPTH 8U使用 OpenCV 进行图像处理 HarrisCorner 提到了类似的东西 但我实际上对角落不感兴趣 谢谢 如果像素等于 局部 邻域中的最大值 则该像素被视为局部最大值 下面的函数
  • 为什么 ANTLR4 不匹配单词“of”和标点符号“,”?

    我有一个Hello g4带有语法定义的语法文件 definition wordsWithPunctuation words WORD wordsWithPunctuation word word punctuation word word