ANTLR 4.5 - 不匹配的输入“x”期望“x”

2023-12-05

我已经开始使用 ANTLR 并注意到它的词法分析器规则非常变化无常。一个极其令人沮丧的例子如下:

grammar output;

test: FILEPATH NEWLINE TITLE ;

FILEPATH: ('A'..'Z'|'a'..'z'|'0'..'9'|':'|'\\'|'/'|' '|'-'|'_'|'.')+ ;
NEWLINE: '\r'? '\n' ;
TITLE: ('A'..'Z'|'a'..'z'|' ')+ ;

该语法将不匹配如下内容:

c:\test.txt
x

奇怪的是如果我改变TITLE to be TITLE: 'x' ;这次它仍然失败,给出一条错误消息,指出“输入‘x’期望‘x’不匹配”,这非常令人困惑。更奇怪的是,如果我替换使用TITLE in test with FILEPATH整个事情有效(尽管FILEPATH会匹配比我想要匹配的更多,所以一般来说这对我来说不是一个有效的解决方案)。

我非常困惑为什么 ANTLR 会给出如此极其奇怪的错误,然后在处理事情时突然无缘无故地工作。


这似乎是一个常见的误解ANTLR:

ANTLR 中的语言处理:

语言处理分两个严格独立的阶段完成:

  • 词法分析,即将文本划分为标记
  • 解析,即从标记构建解析树

由于词法分析必须先于解析,因此会产生一个结果:词法分析器独立于解析器,解析器不能影响词法分析.

Lexing

ANTLR 中的词法分析工作如下:

  • 所有第一个字符大写的规则都是词法分析器规则
  • 词法分析器从头开始并尝试找到与当前输入最匹配的规则
  • 最佳匹配是具有最大长度的匹配,即将下一个输入字符附加到最大长度匹配而产生的标记与任何词法分析器规则都不匹配
  • tokens are generated from matches:
    • if one rule匹配最大长度匹配对应的token被push到token流中
    • if 多重规则匹配最大长度匹配语法中第一个定义的标记被推送到标记流

示例:你的语法有什么问题

你的语法有两条至关重要的规则:

FILEPATH: ('A'..'Z'|'a'..'z'|'0'..'9'|':'|'\\'|'/'|' '|'-'|'_'|'.')+ ;
TITLE: ('A'..'Z'|'a'..'z'|' ')+ ;

每个与 TITLE 匹配的匹配项也将与 FILEPATH 匹配。并且 FILEPATH 定义在 TITLE 之前:因此,您希望成为标题的每个标记都将是一个 FILEPATH。

有两个提示:

  • 保持词法分析器规则分离(任何标记都不应与另一个标记的超集匹配)。
  • 如果您的标记有意匹配相同的字符串,则将它们按正确的顺序排列(在您的情况下这就足够了)。
  • 如果您需要解析器驱动的词法分析器,则必须更改为另一个解析器生成器:PEG-Parsers 或 GLR-Parsers 可以做到这一点(但当然这可能会产生其他问题)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ANTLR 4.5 - 不匹配的输入“x”期望“x” 的相关文章

  • 使用 Antlr 获取标识符和函数名称

    我正在尝试使用和理解 AntLR 这对我来说是新的 我的目的是读取用 C 编写的源代码文件并从中提取标识符 变量和函数名称 在我的 C 语法中 文件C g4 考虑 identifierList Identifier identifierLi
  • ANTLR如何在输入结束时检测垃圾数据

    当使用 ANTLR 编写的语法时 解析器可以正确识别输入流中的数据 但如果我在输入末尾有一些垃圾文本 不应该由语法解析 解析器不会抱怨 我想这种行为是可以的 我的意思是解析器完成了它的工作并解析了我所说的它应该解析的任何内容 但是有什么技巧
  • ANTLR语法互左递归

    我确实知道这个问题已经被问过很多次了 我正在尝试使用 ANTLR 构建语法 Predicate LOWERCASE Predicate VarChars VarChars LOWERCASE UPPERCASE fragment LOWER
  • antlr4:如何知道在给定上下文的情况下选择了哪个替代方案

    假设有一个关于 类型 的规则 它可以是预定义类型 由 IDENTIFIER 引用 或 typeDescriptor type IDENTIFIER typeDescriptor 在我的程序中 我有一个 typeContext ctx 的实例
  • ANTLR 歧义问题

    我有这个语法 grammar MyGrammar prog lexeme lexeme TOK INTLIT 0 9 Identifiers Letter Letter Digit fragment Letter a zA Z fragme
  • 在 Linux 上安装 antlr4 c++ 运行时后,一些包含文件被破坏

    我在linux上下载了antlr4工具并安装了c 运行时 usr local include 我创建了一个小语法文件 使用antlr4命令成功生成了解析器和词法分析器 但是在编译主文件时出现以下错误 我改变了Interval h里面的标题
  • xtext 中的终端/数据类型/解析器规则

    我正在使用 xtext 2 4 我想做的是类似 SQL 的语法 让我困惑的是我不确定哪些东西应该被视为终端 数据类型 解析器规则 到目前为止我的语法相关MyTerm is Model terms MyTerm MyTerm constant
  • Antlr4 - 有使用 ParseTree Walker 的简单示例吗?

    Antlr4 有一个新类 ParseTreeWalker 但我该如何使用它呢 我正在寻找一个最小的工作示例 我的语法文件是 gram g4 我想解析文件 program txt 到目前为止 这是我的代码 这假设 ANTLR 已经运行了我的语
  • 在 ANTLR 3 中,如何在运行时而不是提前生成词法分析器(和解析器)?

    我想在运行时生成 antlr 词法分析器 也就是说 生成语法并从语法生成词法分析器类及其在运行时的支持位 我很高兴将它输入到 java 编译器中 它可以在运行时访问 这是一种快速但肮脏的方法 生成一个combined ANTLR 语法 g给
  • ANTLR4 不报告歧义

    给出以下语法 grammar ReportAmbiguity unit statements statements callStatement lt uncomment this line callStatement CALL ID arg
  • 语义词法分析器谓词性能

    我有一个词法分析器为传递给词法分析器的宏字符串的动态列表创建 MACRO 标记 我在最顶层的词法分析器规则中使用了语义谓词来实现此功能 MACRO macros null tryMacro Where tryMacro 只是检查是否有任何宏
  • C# ANTLR 语法?

    我正在寻找交钥匙ANTLR http www antlr org C 语法 生成可用的抽象语法树 AST 并且与后端语言无关或以 C C C 或 D 为目标 它不需要支持错误报告 附 我不愿意做任何修复 因为替代方案并不难 这可能太晚了 但
  • python 2.7中没有名为antlr4的模块

    我想将 ANTLR4 与 Python 2 7 一起使用 为此我执行了以下操作 我安装了这个包antlr4 4 6 1在 Arch Linux 上sudo pacman S antlr4 我写了一个MyGrammar g4文件并成功生成了词
  • ANTLR 实现类似Python的缩进相关语法的最简单方法是什么?

    我正在尝试实现类似Python的缩进相关语法 来源示例 ABC QWE CDE EFG EFG CDE ABC QWE ZXC 正如我所看到的 我需要的是实现两个标记 INDENT 和 DEDENT 所以我可以编写如下内容 grammar
  • 使用 ANTLR3 解析换行符、EOF 作为语句结束标记

    我的问题是关于在 ANTLRWorks 中运行以下语法 INT 0 9 SEMICOLON NEWLINE r n n r STMTEND SEMICOLON NEWLINE NEWLINE statement STMTEND INT ST
  • 两个基本的 ANTLR 问题

    我正在尝试使用 ANTLR 来获取简单的语法并生成汇编输出 我在 ANTLR 中选择的语言是 Python 许多教程看起来非常复杂或详细阐述与我无关的事情 我真的只需要一些非常简单的功能 所以我有两个问题 将值从一个规则 返回 到另一规则
  • Antlr 处理异常

    我使用 Antlr 3 和 AST 树开发了一个复杂的语法 ANTLR 生成词法分析器和解析器 问题是 例如 当用户输入无效的语法时 该语法需要 用户没有输入此内容 然后在我的 Eclipse IDE 中出现以下异常 line 1 24 m
  • 使用antlr4获取预处理器行并解析C代码

    我正在使用 Antlr4 来解析 C 代码 并使用以下语法来解析 链接到 C g4 https github com antlr grammars v4 blob master c C g4 上面的语法默认不提供任何解析规则来获取预处理器语
  • 自动解析 PHP,将 PHP 代码与 HTML 分离

    我正在开发一个大型 PHP 代码库 我想将 PHP 代码与 HTML 和 JavaScript 分开 我需要对 PHP 代码进行多次自动搜索和替换 对 HTML 进行不同的搜索和替换 对 JS 进行不同的自动搜索和替换 有没有一个好的解析器
  • 如何在 Antlr4 中为零参数函数编写语法

    我的函数具有参数语法 如下面的词法分析器和解析器 MyFunctionsLexer g4 lexer grammar MyFunctionsLexer FUNCTION FUNCTION NAME A Za z0 9 DOT COMMA L

随机推荐

  • C++ 判断类是否可以使用对象 - 文本RPG游戏

    我面临以下设计问题 TL TD 需要确定英雄 类 是否可以使用特定对象 而有很多英雄实现 我有 Hero 类的 3 个子类 每个子类都可以使用特定的物品 对于 Weapons hpp 我有剑 锤子 十字弓 弓 魔杖 法杖 战士可以使用剑或锤
  • 如何防止用户使用后退按钮成功登录后返回登录页面

    我正在开发 MVC3 应用程序 但遇到了登录安全问题 场景是当用户使用他 她的用户名和密码登录时 如果正确 他 她将被重定向到他们的主页 但是 如果他们单击浏览器后退按钮 他们就会返回到登录页面 就我而言 这是我不想要的 就像 facebo
  • 使用 netbeans 调试 cakephp - 无变量

    我按照这些说明使用 netbeans 和 xdebug 设置 cakephp 调试http www tiplite com cakephp debug in netbeans 我让它工作了 但是当我到达断点时我看不到任何变量 有一个选项可以
  • 如何在 OpenCV 中估计两个相机的位置?

    我有来自两个图像的两组对应点 我估计了编码摄像机之间转换的基本矩阵 E mask cv2 findEssentialMat points1 points2 1 0 然后我提取了旋转和平移分量 points R t mask cv2 reco
  • 如何更改 javascript 变量的字体?

    我正在尝试制作一个类似于 cookie clicker 的游戏 这是我的代码的一部分 var clicks 0 function updateClickCount document getElementById clickCount inn
  • .NET 4 出现“找不到指定的过程”错误

    我正在使用 Visual Studio 2012 11 0 51106 01 Update 1 在 64 位 Windows 7 机器上进行开发 我有一个支持项目 它将一些 C 代码编译成 32 位 DLL 在我的标题中我有 define
  • 如何在 Ubuntu 中增加 docker 磁盘映像大小

    我正在尝试增加 ubuntu 上的 docker 映像大小 当我执行 docker info 时 我得到以下信息 Containers 0 Running 0 Paused 0 Stopped 0 Images 0 Server Versi
  • C 从指向结构体第二个成员的指针获取指向结构体的指针是否合法?

    我想知道前面的行是否有注释 这是合法的C吗 在函数中dumpverts 底部 是否合法 C include
  • 如何让rxjs大理石同步分组只占用一帧

    根据https github com ReactiveX rxjs blob master docs app content guide testing marble testing md marble syntax abc on fram
  • 在 Spring AOP 中使用 @AfterReturning 修改类的值

    如何使用 AfterReturning建议修改值 它适用于除字符串之外的任何对象 我知道字符串是不可变的 以及如何在不更改 AccountDAO 类中 saveEverything 函数的返回类型的情况下修改字符串 这是代码片段 Compo
  • 如何比较两个函数的外延等价性,如 (λx.2*x) == (λx.x+x)?

    有没有办法比较两个函数是否相等 例如 x 2 x x x x 应该返回 true 因为它们显然是等价的 众所周知 一般函数相等性通常是不可判定的 因此您必须选择您感兴趣的问题的子集 您可以考虑其中一些部分解决方案 普雷斯堡算术是一阶逻辑 算
  • iPhone的NSUserdefaults是数据库或plist

    我无法正确获取 NSUserDefaults 概念 那是plist文件的数据库吗 它是在应用程序重新启动之间保留的键值存储 它的实现方式与您如何使用它几乎没有关系
  • 递归爬楼梯难题的 Java 基准

    这个现在非常常见的算法问题是监考人员在白板考试期间提出的 我的工作是观察 倾听并客观地判断给出的答案 但我既无法控制所提出的问题 也无法与回答者互动 有五分钟的时间来分析问题 候选人可以编写项目符号 伪代码 在实际代码编写过程中是允许的 只
  • 在 xml 中注入属性失败(spring-ws 配置)

    我正在使用 Spring WS 并具有以下 spring ws servlet xml 文件 defaultURI 和编组器的注入不起作用 因为当我到达服务客户端中的方法时 这些属性为空 所发生的情况是 使用正确的值调用 setter 但在
  • 在maven项目中运行scala应用程序

    我正在尝试使用 Maven 来处理 Eclipse 中的 scala 项目中的依赖关系 但是一旦项目转换为maven 应用程序将不再运行 以下是重现步骤 1 新的scala项目 项目名称 测试 finish 2 新的scala对象 名称 你
  • 模板始终使用指令中的旧范围值进行编译

    我有一个像这样工作的指令 http jsfiddle net smithkl42 cwrgLd0L 23 App directive prettify compile function compile var templateFn retu
  • 从文件中提取单词

    我使用 python 打开一个文件 以查找打开的文件中是否存在预定义的单词集 我在列表中获取了预定义的单词集并打开了需要测试的文件 现在有什么方法可以在 python 中提取单词而不是行 这让我的工作变得更加轻松 import re def
  • 搜索并替换特殊字符 PHP

    我正在尝试搜索并替换从 csv 文件解析的字符串中的特殊字符 当我用 vim 打开文本文件时 它显示字符是 我一生都无法弄清楚这是要与 preg replace 一起使用的字符 任何帮助 将不胜感激 Thanks 克里斯 爱德华兹 0x95
  • 使发送密钥更快

    我正在尝试创建一个程序 该程序将打开 命令提示符 并使用 sendKeys 打开特定端口 这是我的代码 Set Keys CreateObject WScript Shell oShell ShellExecute cmd exe runa
  • ANTLR 4.5 - 不匹配的输入“x”期望“x”

    我已经开始使用 ANTLR 并注意到它的词法分析器规则非常变化无常 一个极其令人沮丧的例子如下 grammar output test FILEPATH NEWLINE TITLE FILEPATH A Z a z 0 9 NEWLINE