ANTLR 入门并避免常见错误

2023-12-24

我已经开始学习 ANTLR,并且拥有 2007 年的书《The Definitive ANTLR Reference》和 ANTLRWorks(用于创建语法的交互式工具)。而且,作为这样的人,我从第三章开始。(“针对不耐烦的人的快速浏览”)。

这是一个相当痛苦的过程,特别是因为有些错误是相当难以理解的(例如ANTLR:“规则范围内缺少属性访问”问题 https://stackoverflow.com/questions/1658869/antlr-missing-attribute-access-on-rule-scope-problem这对我来说只是意味着“你出了问题”)。另外,我有一些非常简单的语法(仅限 3-4 个产生式)和简单的输入(2 行),运行时会出现“OutOfMemory”错误。

ANTLR 网站很有用,但有些碎片化,一些 SO 用户评论道(https://stackoverflow.com/questions/278480/good-tutorial-for-antlr https://stackoverflow.com/questions/278480/good-tutorial-for-antlr)这本书和教程期望具有较高的入门水平。因此,我一直不愿意接近 ANTLR 讨论列表。

LATER我们正在开始应对它。拥有可以逐渐扩展的简单可靠的示例将很有用。它当然值得掌握,因为我们基于 ANTLR 重塑了相当多的思维。

问题之一是ANTLR V3较V2有重大变化。 SO(以及 ANTLR 页面)上的一个答案提到了不再可用的 V2 语法。

SO 上的一些 ANTLR 问题对我帮助很大,但找到它们有点临时。所以我想知道 SO 用户如何帮助减轻学习过程的痛苦。 (如果您参考参考书,指出特定页面会很有用)。

EDIT。 @duffymo 和 @JamesAnderson 已经证实 ANTLR 是一项艰苦的工作 - 主要是因为解析器很困难。 (FWIW 我已经通过了 LEX/YACC 等,毫无疑问 ANTLR 更强大并且更容易使用。)我认为有可能避免弄脏的区域仍然很有用,例如:

  • 确保变量名大小写正确
  • 将包名称添加到词法分析器和解析器
  • 注意规则的顺序,因为它会影响优先级

更多类似的内容将会很有用。


我同意 - ANTLR 不适合胆小的人。它确实需要较高的入门水平,因为语法和解析器并不简单。

话虽如此,这里有一些建议:

  1. 忘记 v2 吧。版本 3 为标准;甚至不要浪费时间考虑早期版本或其文档。
  2. OutOfMemoryError 告诉您您定义的语法中有一些循环。
  3. IntelliJ 有一个很棒的 IDE 可以与 ANTLR v3 配合使用。它将为您提供语法的图形表示、逐步调试等。如果您要使用 ANTLR 进行大量工作,那么花几美元购买许可证是值得的。

ANTLR 并不容易掌握。书很好,但是很厚重。正如您所指出的,错误消息很神秘。如果这里有人能让这件事变得简单,我会感到惊讶。

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

ANTLR 入门并避免常见错误 的相关文章

  • ANTLR:有一个简单的例子吗?

    我想开始使用 ANTLR 但是在花了几个小时查看了示例之后antlr org http www antlr org 网站上 我仍然无法清楚地了解Java的语法过程 有没有一些简单的例子 比如用 ANTLR 实现的四操作计算器 遍历解析器定义
  • 如何管理 ANTLR 中的可选空白?

    我正在尝试解析 ANTLR 中的数据文件 它有可选的空格 例如 3 6 97 12 15 18 下图显示了线的起点和终点 末尾有一个换行符 并且没有制表符 3 6 97 12 15 18 我的语法是 lines line line ws1
  • 否定内部词法分析器和解析器规则

    否定元字符如何 在 ANTLR 的词法分析器和解析器规则中使用吗 否定可以发生在内部词法分析器和解析器规则 https stackoverflow com questions 4297770 practical difference bet
  • Antlr 数组帮助

    嘿 我开始在 java 中使用 Antlr 我想知道如何将一些值直接存储到二维数组中并返回该数组 我根本找不到任何关于此的教程 感谢所有帮助 假设您想要解析一个包含由空格分隔的数字的平面文本文件 您想将其解析为二维数组int其中每一行都是数
  • ANTLR 解析器生成器最适合内存有限的 C++ 应用程序吗?

    我正在寻找一个好的解析器生成器 我可以用它来读取我们的大型商业应用程序中的自定义文本文件格式 目前 这种特定的文件格式是使用手工递归解析器读取的 但该格式已经发展和复杂化到该方法变得难以管理的程度 看来最终的解决方案是为这种格式构建正确的语
  • 使用 ANTLR 构建自己的 C# 编译器:编译单元

    Create a scanner that reads from the input stream passed to us CSLexer lexer new CSLexer new ANTLRFileStream f tokens To
  • ANTLR4:空白处理

    我见过许多使用空格处理的 ANTLR 语法 如下所示 WS n t r gt skip or WS n t r gt channel HIDDEN 因此空格被丢弃并分别发送到隐藏通道 使用这样的语法 grammar Not start ex
  • 使用 Antlr 获取标识符和函数名称

    我正在尝试使用和理解 AntLR 这对我来说是新的 我的目的是读取用 C 编写的源代码文件并从中提取标识符 变量和函数名称 在我的 C 语法中 文件C g4 考虑 identifierList Identifier identifierLi
  • ANTLR 隐式乘法

    我是 ANTLR 的新手 我正在尝试扩展所提供的简单计算器的示例here https stackoverflow com a 1932664 具体来说 我尝试添加一些简单的函数 负数等 以熟悉 ANTLR 然而 我在尝试实现 隐式 乘法时遇
  • 用于计算类数的部分语法

    我需要计算正确的 C 源文件中的类数量 我写了以下语法 grammar CSharpClassGrammar options language CSharp2 parser namespace CSharpClassGrammar Gene
  • 是否需要担心“解析器规则中的隐式标记定义”?

    我正在使用 ANTLR 和 ANTLRWorks 2 创建我的第一个语法 我已经完成了语法本身 它识别用所描述的语言编写的代码并构建正确的解析树 但除此之外我还没有开始任何事情 让我担心的是 解析器规则中第一次出现的标记都会用黄色曲线下划线
  • 将简单的 Antlr 语法转换为 Xtext

    我想将一个非常简单的Antlr语法转换为Xtext 所以没有句法谓词 https stackoverflow com questions 5728659 translate antlr grammar into xtext grammar
  • 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
  • 可视化使用 ANTLR 创建的 AST(在 .Net 环境中)

    为了一个我喜欢的项目 我开始摆弄 ANTLR 在学习了一些教程之后 我现在尝试为我自己的语言创建语法并生成 AST 现在我主要在 ANTLRWorks 中闲逛 但现在我已经验证了解析树似乎没问题 我想 迭代地 因为我仍在学习 仍然需要对最终
  • 将 xtext 编辑器支持与外部 ANTLR 解析器链接起来

    我当前的项目 将其命名为 IoTSuite 采用高级规范 解析它们 并生成 Java 和 Android 代码 在这个项目中 我编写了 ANTLR 语法来解析高级规范 并使用 StringTemplate 作为代码生成器 然而 由于良好的编
  • ANTLR 4 - 树模式匹配

    我试图理解 ANTLR 4 中的解析树匹配 所以为此 我有以下java代码 package sampleCodes public class fruits public static void main String args int a
  • ANTLR“无法启动调试器。等待连接到远程解析器超时。”

    我在 AntlrWorks 中运行的 ANTLR 语法之一抛出 无法启动调试器 等待连接到远程解析器超时 过去 此消息通常会消失 但此消息会持续存在 在搜索 ANTLR 列表时 例如http www antlr org pipermail
  • 使用 ANTLR3 解析换行符、EOF 作为语句结束标记

    我的问题是关于在 ANTLRWorks 中运行以下语法 INT 0 9 SEMICOLON NEWLINE r n n r STMTEND SEMICOLON NEWLINE NEWLINE statement STMTEND INT ST
  • ANTLR语法的迁移工具

    假设我有以下简单语法 查询 DSL grammar TestGrammar term textTerm textTerm Text T VALUE STRING T VALUE value STRING WS t r n gt skip 然

随机推荐

  • CSS 类选择器通配符[重复]

    这个问题在这里已经有答案了 所以我想知道是否有办法在 CSS 中添加通配符 我有几个课程是 button 0 button 1 button 2 button 3等在一个button元素 我想得到所有 button 类来定义 是否可以做类似
  • 提取括号之间文本的模式

    如何从中提取字符串 and 使用模式匹配或任何东西 例如 如果文本是 你好 Java 那么如何只得到 Java 尝试这个 String x Hello Java Matcher m Pattern compile matcher x whi
  • 我可以使用客户端 Javascript 执行 DNS 查找(主机名到 IP 地址)吗?

    我想使用客户端 Javascript 来执行从客户端计算机看到的 DNS 查找 主机名到 IP 地址 那可能吗 Edit 这个问题让我很痒 所以我在 Google App Engine 上建立了一个 JSON Web 服务来返回客户端的 I
  • FFmpeg-Python 音频在最终视频中丢失

    我试图将视频放置在背景图像之上 但生成的输出视频没有音频 有什么办法可以让音频保持原样吗 def ConvertVideo source background start end dest stream ffmpeg input sourc
  • 奇怪的 while 语句行为?

    我不明白为什么以下陈述不起作用 randomKey random choice list topic keys randomValue random choice topic randomKey current len randomValu
  • 在一个 Android 应用程序中拥有多个 SQLiteOpenhelper

    我想知道是否可以在同一个 Android 应用程序中拥有多个 DbOpenHelper 但使用它们在同一个数据库中写入和读取 因为我试图从 2 个不同的 OpenHelper 具有不同的名称 创建表 但似乎只有第一个可以创建 当我尝试运行第
  • CKNotificationInfo soundName 不起作用

    Sbuscription 的创建如下 可以用 但是没有声音 为什么 医生说 if you specify the string default for this property the system plays the default a
  • 如何在Java中获取特定年份的所有星期日的日期?

    我正在认真寻找这段代码 我是新程序员 实际上我想让所有日期都带有标志 这些日期都是特定年份的星期日 请 我热切地等待您的回复 创建一个新日历 将时间设置为 1 1 yyyy 和某个时间 检查当前日期是否为星期日 然后向前滚动一天 直到星期日
  • 如何让 djangorestframework 使用格式后缀返回 xml?

    我可以让 djangorestframework 通过格式后缀 json 返回 json 但不能通过 xml 后缀返回 xml http 127 0 0 1 8000 chat rooms json id 1 timestamp 2013
  • memmem() STL 方式?

    是否有 STL 算法可用于像 memmem 一样搜索缓冲区内的字节序列 我不知道这是否是好的代码 但是以下代码可以使用std search http www cplusplus com reference algorithm search
  • Xcode 4.2 中的未知类型名称“命名空间”

    我正在编译QCAR SDK 但是当我向项目中添加更多框架后 它提示错误 Matrices h ifndef QCAR MATRIX H define QCAR MATRIX H namespace QCAR Matrix with 3 ro
  • PHP MP3 标签处理

    我有一个 php 脚本 我想提供其中的音乐列表 这些文件被命名为 01 mp3 02 mp3 和 03 mp3 等 他们都有标签信息 我的问题是如何在我的 php 脚本中访问它 您需要一个脚本来解析 mp3 文件以访问数据 来自谷歌 htt
  • 增量附加 numpy.arrays 到保存文件

    我已经尝试过 Hpaulji 概述的这种方法 但它似乎不起作用 如何在python中将多个numpy文件附加到一个numpy文件中 https stackoverflow com questions 42204368 how to appe
  • 在文本字段 Flutter 内部添加阴影

    我有这个设计 我想将其用于我的应用程序 但我不太确定如何添加框阴影 阴影位于文本字段的内部 请问有人可以给我一些帮助并为我指出如何执行此操作的正确方向吗 文本字段顶部的框阴影 干杯 杰克 您可以使用容器作为背景来实现这一点 例如使用线性 坡
  • 列表框 itemtemplate 内的绑定问题

    我有两个单独的列表框绑定问题 其中的 itemtemplate 包含一个文本框 1 一个列表框绑定到一串字符串 如何在创建的文本框中显示每个字符串并同时允许两种方式绑定 如果不指定 Path 或 XPath 则不允许进行双向绑定
  • NHibernate 从 SymbolSource.org 加载符号

    我希望能够调试 NHibernate 但我从未加载过任何符号SymbolSource org前 我需要在 Visual Studio 中输入什么 url 才能加载 NHibernate 的符号 以便我可以正确调试它 我正在运行 NHiber
  • 当内容扩展超过窗口大小时,在绝对定位元素上设置 100% 高度

    因此 在阅读 Stack Overflow 和网络之后 我发现实现 100 高度有两个主要技巧 在 HTML 和 BODY 上设置 height 100 Set your element to have either 高度 100 或 顶部
  • 无法以编程方式滚动到 JList 中的最后一项

    我有一个 JList 嵌套在 JScrollPane 中 当我向 JList 添加项目时 我希望 JScrollPane 自动滚动到 JList 的底部 以便最后一个项目可见 为此 我有以下代码 getWordListScroller ge
  • 在 Go 中要求 HTTP 基本身份验证的惯用方式?

    情况 我正在使用 Gorilla 的 mux 作为路由器构建 REST API 我想知道如何使用简单的 HTTP 基本身份验证来保护特定路由 我不需要从文件或任何外部源读取凭据 我真的只想通过硬编码的 HTTP 基本身份验证用户名和密码来保
  • ANTLR 入门并避免常见错误

    我已经开始学习 ANTLR 并且拥有 2007 年的书 The Definitive ANTLR Reference 和 ANTLRWorks 用于创建语法的交互式工具 而且 作为这样的人 我从第三章开始 针对不耐烦的人的快速浏览 这是一个