ANTLR:自定义语法示例的词法错误帮助

2023-12-30

什么方法可以让我最大限度地报告词法错误?

举一个简单的例子,我想为以下文本编写语法

(为了简单起见,空格被忽略,字符串常量中不能有 \"):

myvariable = 2
myvariable = "hello world"

Group myvariablegroup {
    myvariable = 3
    anothervariable = 4
}

使用词法分析器捕获错误

如何最大限度地发挥词法分析器的错误报告潜力?

读完这篇文章后:我应该在哪里划清词法分析器和解析器之间的界限? https://stackoverflow.com/questions/5362078/where-should-i-draw-the-line-between-lexer-and-parser

我知道词法分析器应该尽可能与解析器语法匹配,但是词法错误报告策略呢?

捕获词法错误的常用策略是什么?

我正在想象一个具有以下“错误”标记的语法:

GROUP_OPEN: 'Group' WS ID WS '{';
EMPTY_GROUP: 'Group' WS ID WS '{' WS '}';
EQUALS: '=';
STRING_CONSTANT: '"~["]+"';
GROUP_CLOSE: '}';
GROUP_ERROR: 'Group' .; // the . character is an invalid token
                        // you probably meant '{'
GROUP_ERROR2: .'roup' ; // Did you mean 'group'?
STRING_CONSTANT_ERROR: '"' .+; // Unterminated string constant
ID: [a-z][a-z0-9]+;
WS: [ \n\r\t]* -> skip();
SINGLE_TOKEN_ERRORS: .+?;

您的方法显然存在一些问题:

  • 你正在跳过WS(这很好),但是您仍在其他规则中使用它。但你在词法分析器中,这导致我们......

  • 词法分析器正在识别您的组。我认为你不希望它们成为一个单一的令牌。您的组属于解析器。

  • 正如所写的,您的语法将为以结尾的事物创建特定的标记类型roup, so croup例如可能永远不会匹配ID。这不好。

  • STRING_CONSTANT_ERROR太宽泛了。它能够全局化整个输入。看我的UNTERMINATED_STRING below.

  • 我不太确定会发生什么SINGLE_TOKEN_ERRORS...请参阅下文了解替代方案。

现在,这里是我使用的错误标记的一些示例,这对于错误报告非常有效:

UNTERMINATED_STRING
    :   '"' ('\\' ["\\] | ~["\\\r\n])*
    ;

UNTERMINATED_COMMENT_INLINE
    :   '/*' ('*' ~'/' | ~'*')*? EOF -> channel(HIDDEN)
    ;

// This should be the LAST lexer rule in your grammar
UNKNOWN_CHAR
    :   .
    ;

请注意,这些未终止的标记代表单个原子值,它们不跨越逻辑结构。

Also, UNKNOWN_CHAR无论如何,如果您将其定义为,则将是单个字符.+?无论如何,它总是会精确匹配一个字符,因为它将尝试匹配尽可能少的字符,而最少是一个字符。
当有东西跟随时,非贪婪量词才有意义。例如在表达式中.+? '#', the .+?将被迫消耗字符,直到遇到#符号。如果.+?表达式是单独的,它不必消耗多个字符来匹配,因此相当于..

我在词法分析器(.NET ANTLR)中使用以下代码:

partial class MyLexer
{
    public override IToken Emit()
    {
        CommonToken token;
        RecognitionException ex;

        switch (Type)
        {
            case UNTERMINATED_STRING:
                Type = STRING;
                token = (CommonToken)base.Emit();
                ex = new UnterminatedTokenException(this, (ICharStream)InputStream, token);
                ErrorListenerDispatch.SyntaxError(this, UNTERMINATED_STRING, Line, Column, "Unterminated string: " + GetTokenTextForDisplay(token), ex);
                return token;

            case UNTERMINATED_COMMENT_INLINE:
                Type = COMMENT_INLINE;
                token = (CommonToken)base.Emit();
                ex = new UnterminatedTokenException(this, (ICharStream)InputStream, token);
                ErrorListenerDispatch.SyntaxError(this, UNTERMINATED_COMMENT_INLINE, Line, Column, "Unterminated comment: " + GetTokenTextForDisplay(token), ex);
                return token;

            default:
                return base.Emit();
        }
    }

    // ...
 }

请注意,当词法分析器遇到错误的标记类型时,它会显式地将其更改为有效的标记,因此解析器实际上可以理解它。

现在,解析器的工作就是识别不良结构。 ANTLR 足够聪明,可以执行单令牌删除和单令牌插入,同时尝试将自身与无效输入重新同步。这也是我让UNKNOWN_CHAR滑入解析器,因此它可以丢弃它并显示错误消息。

只需获取它生成的错误并更改它们,以便向用户呈现更好的东西。

因此,只需将您的组放入解析器规则即可。


一个例子:

考虑以下输入:

Group ,ygroup {

在这里,,显然是一个拼写错误(用户按下,代替m).

如果你使用UNKNOWN_CHAR: .;您将获得以下代币:

  • Group类型的GROUP
  • ,类型的UNKNOWN_CHAR
  • ygroup类型的ID
  • {类型的'{ '

解析器将能够找出UNKNOWN_CHAR令牌需要被删除并将正确匹配一个组(定义为GROUP ID '{' ...).

ANTLR 将在发现意外标记的位置插入所谓的错误节点(在本例中是在GROUP and ID)。然后,为了解析的目的,这些节点将被忽略,但您可以使用访问者/侦听器检索它们来处理它们(您可以使用访问者的VisitErrorNode方法为例)。

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

ANTLR:自定义语法示例的词法错误帮助 的相关文章

  • 如何解析代码(Python)?

    我需要解析一些特殊的数据结构 它们采用某种类似 C 的格式 大致如下所示 Group GroupName C Style comment Group AnotherGroupName Entry some variables 0 3 141
  • 两个基本的 ANTLR 问题

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

    我需要一种方法来分析 ARM 的 GCC 编译器的输出文件 我正在为裸机进行编译 并且我非常关心大小 我可以用arm none eabi objdump由交叉编译器提供 但如果存在用于此任务的工具 则解析输出并不是我渴望做的事情 您知道存在
  • 从 csv 中读取 pandas 数据帧,以非固定标头开始

    我有许多数据文件是由我的实验室中使用的一些相当黑客的脚本生成的 该脚本非常有趣 因为它在标头之前附加的行数因文件而异 尽管它们具有相同的格式并具有相同的标头 我正在编写一个批处理来将所有这些文件处理为数据帧 如果我不知道位置 如何让 pan
  • 为什么 Parsec 的 sepBy 停止并且不解析所有元素?

    我正在尝试解析一些逗号分隔的字符串 该字符串可能包含也可能不包含具有图像尺寸的字符串 例如 hello world 300x300 good bye world 我写了下面的小程序 import Text Parsec import qua
  • 如何在Java中有效地读取由大量小项目组成的大型XML文件?

    我有一个很大的 XML 文件 其中包含相对固定大小的项目 即
  • 使用 TStringList 的分隔符解析字符串,似乎也解析空格(Delphi)

    我有一个简单的字符串 由某个字符分隔 比如说逗号 我应该能够创建一个 TStringList 并将其分隔符设置为逗号 然后将 DelimitedText 设置为我想要解析的文本 并且应该自动解析它 问题是 当我查看输出时 它还包含空格作为分
  • 使用 FoldLine 解析多个块

    对于这个简化的问题 我试图解析一个如下所示的输入 foo bar baz quux woo hoo xyzzy glulx into foo bar baz quux woo hoo xyzzy glulx 我尝试过的代码如下 import
  • python 3 argparse 调用函数

    我想在 python3 中创建一个类似命令行 类似 shell 的界面 Argparse 似乎负责解析和显示帮助 错误消息 根据argparse 的 python3 文档 https docs python org 3 5 library
  • 为正则表达式编写解析器

    即使经过多年的编程 我很羞愧地说我从未真正完全掌握正则表达式 一般来说 当问题需要正则表达式时 我通常可以 在一堆引用语法之后 想出一个合适的正则表达式 但我发现自己越来越频繁地使用这种技术 所以 自学并理解正则表达式properly 我决
  • Swift 3 中的 JSON 解析

    有没有人能够找到一种在 Swift 3 中解析 JSON 文件的方法 我已经能够返回数据 但在将数据分解为特定字段时我没有成功 我会发布示例代码 但我已经尝试了很多不同的方法但没有成功 并且没有保存任何代码 我想要解析的基本格式是这样的 提
  • 使用多个可选模式时顺序的重要性

    可选模式的顺序如何DateTimeFormatter影响解析操作吗 我正在运行这个程序 想知道为什么最后一行抛出异常而不是前三行 public static void main String args String p1 EEEE E dd
  • 获取 Parse Analytics 自定义仪表板

    是否可以使用 Javascript 或 REST API 从 Parse 获取应用程序分析 我想在我自己的仪表板中显示下载数量和自定义事件 不可以 您只能通过 REST API 推送 https parse com docs rest ht
  • iOS 中的 CSV 逐行解析

    我正在 Objective c 中解析 CSV 文件 该文件包含如下内容 line 40 Rising searches line 41 nabi avc Breakout line 42 stonewall 700 line 43 med
  • Rust 编程竞赛中最快的惯用 I/O 例程?

    我的问题已部分得到解答 因此我根据从评论和其他实验中学到的知识对其进行了修改 总之 我想要一个用于编程竞赛的快速 I O 例程 其中使用单个文件解决问题 无需外部包 它应该从一个以空格分隔的标记序列中读取BufRead 标准输入或文件 标记
  • PHP DOM - 剥离 span 标签,保留其内容

    我希望采用如下标记 span class test Some text that is strong bolded strong and contains a a href link a span 并在 PHP 中找到剥离跨度的最佳方法 剩
  • C# 中的编译器

    我正在寻找一个可定制的解析器和 或词法分析器 它可以让我在 C 中构建自定义语法检查器 本质上 用户将输入一行代码 自定义 语法检查器将能够响应是否编写正确 That s Irony http irony codeplex com 请务必阅
  • 使用 ANTLR 为 java 源代码生成抽象语法树

    如何使用 ANTLR 从 java src 代码生成 AST 有什么帮助吗 好的 步骤如下 前往ANTLR站点 http www antlr org 并下载最新版本 下载Java g和JavaTreeParser g文件来自here htt
  • 如何展平解析树并存储在字符串中以进行进一步的字符串操作 python nltk

    我正在尝试从树结构中获取扁平树 如下所示 我想将整个树放在一个字符串中 就像没有检测到坏树错误一样 S NP SBJ NP DT The JJ high JJ seven day PP IN of NP DT the CD 400 NNS
  • LL(1) 解析器中 FIRST 和 FOLLOW 集的用途?

    谁能向我解释一下 LL 1 语法中如何使用 FIRST 和 FOLLOW 我知道它们用于语法表构建 但我不明白如何使用 在 LL 1 解析器中 解析器的工作方式是维护一个工作空间 该工作空间最初播种到开始符号 后跟字符串结束标记 通常表示为

随机推荐

  • 从 mainBundle 加载

    在一些流行的开源 swift 项目中 我注意到以下方法用于从主包加载文件 objc class TestClass NSObject let bundle NSBundle forClass TestClass self let path
  • 如何动态反序列化Json字符串

    我通过以下方式消费了调查数据SSE Stream这给了我每个人逐行回答的格式Survey X data 4482359 12526 5 5 Yes that is right 1 我把它读成List of String using Stre
  • 在活动记录中使用本机 SQL 函数 (codeigniter)

    我正在尝试获取日期大于或等于今天的所有数据 这是我所做的 this gt db gt select id name this gt db gt where dr 1 this gt db gt where end gt CURDATE qu
  • Angular-ui 选项卡在选项卡内容中加载模板

    我正在使用以下控制器使用 angular ui 中的选项卡 scope panes title Home content home active true title Settings content settings title View
  • 如何在 Bash 中获取当前可用磁盘空间?

    我正在运行一些操作 这些操作不断消耗我的磁盘空间 因此 我希望我的计算机在磁盘空间低于 2GB 时发出声音 我知道我可以通过运行获得列出可用磁盘空间的输出df h Filesystem Size Used Avail Capacity iu
  • 为什么 perf stat 将“stalled-cycles-backend”显示为<不支持>?

    Running perf stat ls显示这个 Performance counter stats for ls 1 388670 task clock 0 067 CPUs utilized 2 context switches 0 0
  • gcc静态库链接与动态链接

    我的构建环境是CentOS 5 我有一个名为 libcunit 的第三方库 我用 autotools 安装了它 它生成了两个libcunit a and libcunit so 我有自己的应用程序 它与一堆共享库链接 libcunit a位
  • 错误:“未提供名称属性”- 用于 log4j2.properties 自定义

    我正在自定义 log4j2 properties 以在所需位置生成日志文件 这样做时我收到以下错误 我的 log4j2 properties 文件 status debug name properties configuration Giv
  • CSS 伪类后备?

    我想使用tr nth child even odd 表的伪类 但我也想支持 IE 2 群体 那么 有没有纯CSS的方式来添加边框tr if nth child不支持 你可以试试选择性 http selectivizr com 我认为这是最简
  • 类模板构造函数重载解决歧义

    我正在编写一个像 stl 矢量这样的类模板 两个构造函数如下所示 template
  • 在 Python 中访问 R 用户定义的函数

    因此 我需要通过交叉验证进行原理组件回归 但我在 Python 中找不到可以执行此操作的包 我编写了自己的 PCR 类 但是当针对 R 的 pls 包进行测试时 它的性能明显更差 并且在高维数据 50000 个特征 上速度慢得多 我仍然不确
  • 如何强制 Hibernate 返回空值而不是 null?

    我正在使用 Oracle 11GR2 当 varchar2 字段为空时 执行System out println空白字段上将显示null在我的 Eclipse 控制台上 我怎样才能让它显示空字符串 在 getter 中使用这个技巧很好 但它
  • SameSite None 未在 Azure Web App 中设置 cookie 属性

    为了准备 Chrome 80 中 SameSite 即将发生的更改 我已将 NET Framework API 从4 6 2 to 4 7 2 我创建了一个简单的测试端点 只需设置一个 cookieSameSite None public
  • 强制下载 iOS 5.0.1 符号

    一位客户向我发送了 iOS 5 0 1 9A405 设备的崩溃日志 我在 Snow Leopard 上运行 Xcode 4 2 崩溃日志调用堆栈的系统部分无法符号化 并且它们似乎与崩溃相关 Xcode 中没有 iOS 5 0 1 符号 我没
  • WIX - 对安装取消运行自定义操作

    我正在使用 WIX 编写安装程序 当用户按下 取消 按钮时 我需要执行自定义操作 我创建了一个自定义操作 但我似乎找不到在哪里使用该操作 有什么想法我该怎么做吗 尝试类似的方法
  • 导航栏随着 CSS 动画消失

    我正在使用 Animate css 库中的 CSS3 动画 它们真的很棒 当我将它们与 WOW js 结合起来时 它们工作得非常完美 但是 当我向下滚动页面并且动画进入屏幕时 屏幕顶部的固定导航栏会消失几秒钟 动画显示的时间 然后返回屏幕
  • 适用于 Android 和 iOS 的应用程序 OpenStreetMap [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想使用 OpenStreetMap 制作一个移动本机应用程序 Android 和 iOS 我需要离线
  • Swift 中的惰性属性相当于 Objective C 中的惰性 Init getter

    Swift 中的惰性属性是否相当于用 Objective C 中的惰性加载模式覆盖 getter 来自文档 惰性存储属性是指直到第一次使用时才计算其初始值的属性 您可以通过在声明之前写入惰性属性来指示惰性存储属性 所以 大多数情况下 是的
  • 位图图像未显示在 imageview 中

    我创建了一个应用程序 在其中允许用户从图库中选择图像或从相机拍摄照片并将该图像上传到网络服务器 此代码工作正常 现在在其他屏幕中 我正在从网络服务器下载图像并存储该图像在 SD 卡中 问题是 如果从图库中选择图像 则图像将显示在图像视图中
  • ANTLR:自定义语法示例的词法错误帮助

    什么方法可以让我最大限度地报告词法错误 举一个简单的例子 我想为以下文本编写语法 为了简单起见 空格被忽略 字符串常量中不能有 myvariable 2 myvariable hello world Group myvariablegrou