Antlr4 从错误中恢复并继续解析直到 EOF

2023-12-14

我正在使用 Antlr 4.5 用 Ja​​va 编写 C# 语法。 当我处理具有预处理器指令的 C# 源代码时。 示例代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Hansa
{
    class Program
    {
        public static void Main()
        {
            int b = 5;
            #if true
                int c = 0;
                #if false
                            union {
                                internal struct {
                                    uint    pmclass;
                                    ushort  pmenum;
                                };
                                ushort  bseg;
                                byte[]  Sym;
                                internal struct  {
                                    uint index;
                                    string name;
                                } btype;
                            } pbase;
                #endif
                printMe(c);
            #endif
            printMe(b);
            Console.ReadLine();
        }

        public static void printMe(int val)
        {
            Console.WriteLine(val);
        }
    }
}

在上面的代码示例中,“#if false”和下一个“#endif”之间的代码会生成错误“在输入‘union {’处没有可行的替代方案”。

我需要在代码级别忽略此错误或通过语法忽略行。

在上面的代码中,如果没有任何错误,我可以获得命名空间名称、类名称、方法名称、方法签名和语句行。 当我在“union {”附近遇到错误时,我能够访问命名空间名称、类名称、Main() 方法名称,但无法访问 printMe() 方法声明。

我的要求是,当发生错误时,语法解析不应该终止。它应该从下一行继续到 EOF。

我怎样才能做到这一点?


您将必须重写 ANTLR4 错误恢复。DefaultErrorStrategy将报告NoViableAlternativeException然后恢复。它不会中断解析。因此,如果您的程序因第一个错误而中断:

  • 也许你用另一个ANTLRErrorStrategy。然后调整一下,让它恢复像DefaultErrorStrategy
  • Or your ANTLRErrorListener中断程序,那么您将必须以跳过失败的方式调整此程序。

如果您希望错误恢复确实从下一行开始,则必须调整方法ErrorStrategy.recoverXXX。默认情况下,错误恢复尝试删除/插入魔法令牌,以达到干净的状态。

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

Antlr4 从错误中恢复并继续解析直到 EOF 的相关文章

  • Antlr4 - 有使用 ParseTree Walker 的简单示例吗?

    Antlr4 有一个新类 ParseTreeWalker 但我该如何使用它呢 我正在寻找一个最小的工作示例 我的语法文件是 gram g4 我想解析文件 program txt 到目前为止 这是我的代码 这假设 ANTLR 已经运行了我的语
  • D的语法真的是上下文无关的吗?

    几个月前我在 D 新闻组上发布了这个问题 但由于某种原因 答案从未真正说服我 所以我想我应该在这里问 D 的语法显然是上下文无关的 http www digitalmars com d 2 0 template comparison htm
  • ANTLR @header、@parser、superClass 选项和基本文件 io (Java)

    我想将解析器操作与基本文件 io Java 一起使用 例如 G ANTLR 语法中的 PrintWriter 我必须使用 superClass 选项还是可以使用 header 在这两种情况下 我如何声明 PrintWriter 对象以及如何
  • BNF、EBNF、ABNF:选择哪一个?

    我想提出一种语言语法 我读过一些关于这三个人的内容 但确实看不出有什么是一个人能做而另一个人做不到的 有什么理由使用其中一种而不是另一种吗 或者这只是一个偏好问题 你必须考虑一下EBNF and ABNF作为扩展 可以帮助您在开发语法时更加
  • 语义词法分析器谓词性能

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

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

    我对Antlr4的性能有些怀疑 我目前正在使用 Python 和 Antlr4 与 Java 相比 它非常慢 使用 Antlr4 IntelliJ 插件验证 由于我需要使用更大的代码进行解析 因此我计划切换到 Antlr 最快的语言 例如
  • 解析树和语法信息

    有谁知道在哪里可以找到好的在线资源以及如何制作语法和解析树的示例 最好是介绍材料 信息是 n00b 友好的 我自己在 Google 上没有找到任何好的信息 Edit 我正在考虑理论 而不是特定的解析器软件 网上没有 不过也许你应该看看编译器
  • ANTLR4 相当于什么!在词法分析器规则中?

    我正在努力将旧的 ANTLR 2 语法转换为 ANTLR 4 但我在字符串规则方面遇到了问题 STRING r n 这创建了一个STRING其文本包含字符串内容的标记 但是不含开始和结束引号 因为 引号文字后面的符号 ANTLR 4 扼流圈
  • python 2.7中没有名为antlr4的模块

    我想将 ANTLR4 与 Python 2 7 一起使用 为此我执行了以下操作 我安装了这个包antlr4 4 6 1在 Arch Linux 上sudo pacman S antlr4 我写了一个MyGrammar g4文件并成功生成了词
  • 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 语法中的行首?

    在我使用的语言中 某些关键字必须位于行的开头 这主要是因为语言中的字符串值可以跨越多行 并且字符串可以轻松包含这些关键字 我可以轻松处理旧的 yacc lex 语法实现 因为词法分析器使用普通的正则表达式来匹配文本模式 例如 descrip
  • ANTLR语法的迁移工具

    假设我有以下简单语法 查询 DSL grammar TestGrammar term textTerm textTerm Text T VALUE STRING T VALUE value STRING WS t r n gt skip 然
  • 使用antlr4获取预处理器行并解析C代码

    我正在使用 Antlr4 来解析 C 代码 并使用以下语法来解析 链接到 C g4 https github com antlr grammars v4 blob master c C g4 上面的语法默认不提供任何解析规则来获取预处理器语
  • 是否有一个实用程序可以在给定 ANTLR 语法的情况下生成匹配的字符串?

    我有一个 ANTLR 语法 我想模 糊我的解析器 您是否正在寻找 CFG 语法的生成 IE 语法接受的字符串的生成 这可能是检查语法正确性的好主意 但请记住 可接受的字符串集很可能是无限的 任何真正严重的错误应该已经在语法规范中显而易见 并
  • 如何在 Antlr4 中为零参数函数编写语法

    我的函数具有参数语法 如下面的词法分析器和解析器 MyFunctionsLexer g4 lexer grammar MyFunctionsLexer FUNCTION FUNCTION NAME A Za z0 9 DOT COMMA L
  • ANTLR4 词法分析器无法解决语法顺序中的歧义

    使用 ANTLR 4 2 我尝试对此测试数据进行非常简单的解析 RRV0 ABC 使用最小语法 grammar Tiny thing RRV N HASH ID RRV RRV N 0 9 HASH ID a zA Z0 9 WS t r
  • antlr4-tool 在 Win10 中失败,并显示:错误:命令失败:哪个 java

    在Win10中运行 为了尝试在Node JS中创建解析器 我安装了ANTLR4工具 npm install save dev antlr4 tool Ran c prj parser node modules bin antlr4 tool
  • Gradle 找不到 Antlr 令牌文件

    我创建了一个文件MyLexer g4 inside myproject src main antlr com mypackage like lexer grammar MyLexer DIGIT 0 9 WS t r n gt skip 然

随机推荐

  • _start 可以是拇指函数吗?

    请帮助我使用arm926ejs cpu 的gnu 汇编器 我尝试构建一个简单的程序 test S global start start mov r0 2 bx lr 并成功构建它 arm none linux gnueabi as mthu
  • Play Framework [2.4.x] 如何在子模块的路由文件中寻址公共资源

    上一个问题可以作为当前讨论的 子模块 含义的基线 Play Framework 2 4 x 使用子模块 如果您了解 Play 子模块 那么在给定上下文的情况下 如何输入子模块上的路由条目以公开 公共 文件夹中的资源 每当我尝试创建基本条目
  • 确保 MySQL 连接在 PHP 函数中正常工作

    我有以下形式的代码 这种 类型 代码不起作用 因为 doSomething 没有与数据库的连接 谁能解释为什么不呢 我创建 con 连接before我调用 doSomething 那么为什么该函数表现得好像没有连接一样呢 有什么方法可以解决
  • 在不使用插件的情况下向 WooCommerce 订单号添加后缀和前缀

    我想在不使用插件的情况下向 Woo Commerce 订单号添加后缀和前缀 我尝试使用这个不起作用的钩子 add filter woocommerce order number my woocommerce order number 1 2
  • 如何获取物理存储设备列表?

    我想获取物理存储设备的列表 我见过一些代码 但实际上是循环的 并且执行类似暴力的操作 我想知道获取物理存储磁盘列表的一般方法是什么 我发现了CreateFile 但我不明白如何正确使用它 我需要一个非 wmi 解决方案 如果不查询注册表就更
  • `UIDocument` 的 `save(to:for:completionHandler:)` 崩溃

    我在运行 iOS 9 的每个 32 位设备 模拟器上都会崩溃save to for completionHandler Xcode 8 2 基础 SDK 是 10 2 目标是9 0 标准架构 Swift 3 适用于开发和发布版本 示例项目
  • javascript 错误 [对象 HTMLInputElement][对象 HTMLInputElement]

    我正在练习 java 脚本代码 但在实现此代码时遇到问题 Enter A
  • 检查字典是否是另一个字典的子集的递归函数

    我想递归地检查一本字典是否是另一本字典的子集 我们假设两个字典都有内置类型作为项目 我看到已经有一个很旧的线程了Python 检查一个字典是否是另一个较大字典的子集试图解决类似但不完全是的问题 因为那里的答案都不符合我的目的 所以我决定发布
  • Pandas 中的条件运行总和仅适用于所有先前的值

    假设我有以下数据框 df pd DataFrame Event A B A A B C B B A C Date 2019 01 01 2019 02 01 2019 03 01 2019 03 01 2019 02 15 2019 03
  • iOS 验证数字签名

    在我的应用程序中 我有一个公钥 表示为字符串 纯消息和数字签名 表示为 base64 编码字符串 使用 SHA256 进行哈希处理并使用 RSA 进行加密 现在 我需要验证数字签名 我试图执行以下操作 create SecKeyRef fr
  • 什么是 Setter 和 Getter?

    我对 Objective C 的 Setter 和 Getters 并没有真正的了解 有人可以为初学者提供一个好的指南吗 我注意到 当尝试访问另一个类中的变量时 这会发挥作用 我现在正在尝试这样做 我有两个类 比如说 A 和 B 我在 A
  • “${foo.bar}”和“#{foo.bar}”有什么区别?

    我可以通过表达式语言 EL 在 jsp 文件中使用 Java Bean 中的对象 因此我可以通过输入 foo bar 来获取我的值 但我也可以使用 foo bar 任何人都可以解释其中的差异或提供有意义信息的链接吗 这包含在JSP 2 1
  • Rails:指定没有值的参数给 link_to

    假设路线 map resources articles 你怎么得到这个 articles most popular using link to method 尝试了以下方法 link to articles path most popula
  • 防止 Flutter 中通过 video_player 使用的 ExoPlayer 发送垃圾邮件日志

    每当我在我的播放器中播放新文件时视频播放器我得到一长串日志 这使得查看我自己的日志变得更加困难 其中很多都包含记录值信息和嗨有没有办法让 video player 不那么喋喋不休 I ExoPlayerImpl 21717 Init d44
  • 避免重定向

    我正在尝试解析一个站点 用 ASP 编写 爬虫程序被重定向到主站点 但我想做的是解析给定的网址 而不是重定向的网址 有没有办法做到这一点 我尝试将 REDIRECT False 添加到settings py 文件中 但没有成功 以下是爬虫的
  • ASP.NET MVC3 RAZOR:从部分视图重定向

    我有两个部分视图 MyPopular 和 MyBlogs 有两个控制器 ArticleController cs 和 ThePopularController cs 这两个局部视图都包含按钮 最初 它在索引视图内呈现两个部分视图 在博客点击
  • 如何使用htaccess更改图片路径?

    我有一个包含图像的 html 文件 img src smilies happy gif 是否可以使用此路径重定向到另一个路径 htaccess 所以上面的例子就相当于 img src http static example com smil
  • 从 Excel 引用 Outlook 文件夹

    我创建了一个宏来读取 Outlook 电子邮件并将值和标题 发送的主题时间等 提取到 Excel 这之前可以工作 但现在提示错误 尝试的操作失败 找不到对象 该文件夹的位置是 收件箱 TIBCO 报告文件夹 错误提示在line Set ol
  • 带有填充 pkcs7 C++ 代码的 AES

    我需要一个使用 aes cbc256 和填充的字符串加密示例 在 C 中 gt 我正在 linux Ubuntu 上工作 PKCS7 请帮忙 对于以下代码 如何将 IV 设置为 0 并将键值设置为字符串值 我还想添加 pkcs7 填充 我正
  • Antlr4 从错误中恢复并继续解析直到 EOF

    我正在使用 Antlr 4 5 用 Ja va 编写 C 语法 当我处理具有预处理器指令的 C 源代码时 示例代码 using System using System Collections Generic using System Lin