使用 ANTLR4 识别单行中的多行注释

2024-06-20

我想用 ANTLR4 解析 PostScript 代码。我完成了语法,但是一种特定的语言扩展(由其他人引入)很难被识别。

一个简短的例子:

1: % This is a line comment
2: % The next line just pushes the value 10 onto the stack
3: 10
4: 
5: %?description This is the special line-comment in question
6: /procedure {
7:   /var1 30 def %This just creates a variable
8:   /var2 10 def %?description A description associated with var2 %?default 20
9:   /var3 (a string value) def %?description I am even allowed to use % signs %?default (another value)
10: }

识别行注释,例如第 1、2 和 7 行,可以使用 Lexer-Rules 来完成

LINE_COMMENT: '%' .*? NEWLINE;
NEWLINE: '\r'? '\n';

它简单地匹配 % 之后直到行尾的所有内容。

我遇到的问题是那些特殊的行注释,它们以类似的内容开头%?description or %?default,因为这些也应该被识别,但与 LINE_COMMENT 相比,可以将多个这些放在一行中(例如第 8 行和第 9 行)。所以第 8 行包含两个特殊注释%?description A description associated with var2 and %?default 20.

把它想象成这样(尽管这行不通):

SPECIAL_COMMENT: '%?' .*? (SPECIAL_COMMENT|NEWLINE);

现在是真正棘手的部分:应该允许您在后面添加任意文本%?description包括%同时仍然能够分割个人评论。

简而言之,问题可以简化为分割表格的一行

(%?<keyword> <content with % allowed in it>)+ NEWLINE

e.g.

%?description descr. with % in in %?default (my default value for 100%) %?rest more

into

1.) %?description descr. with % in in 
2.) %?default (my default value for 100%)
3.) %?rest more

有什么想法,如何制定词法分析器或解析器规则来实现这一目标?


考虑到这些规则,我认为您必须在词法分析器中使用谓词来检查输入流中是否出现%?。您还必须确保正常的评论必须以%,但后面没有?(或换行符)。

给定语法:

grammar T;

@lexer::members {
  boolean ahead(String text) {
    for (int i = 0; i < text.length(); i++) {
      if (text.charAt(i) != _input.LA(i + 1)) {
        return false;
      }
    }
    return true;
  }
}

parse
 : token* EOF
 ;

token
 : t=SPECIAL_COMMENT {System.out.println("special : " + $t.getText());}
 | t=COMMENT         {System.out.println("normal  : " + $t.getText());}
 ;

SPECIAL_COMMENT
 : '%?' ( {!ahead("%?")}? ~[\r\n] )*
 ;

COMMENT
 : '%' ( ~[?\r\n] ~[\r\n]* )?
 ;

SPACES
 : [ \t\r\n]+ -> skip
 ;

可以按如下方式进行测试:

String source = "% normal comment\n" +
    "%?description I am even allowed to use % signs %?default (another value)\n" +
    "% another normal comment (without a line break!)";
TLexer lexer = new TLexer(new ANTLRInputStream(source));
TParser parser = new TParser(new CommonTokenStream(lexer));
parser.parse();

并将打印以下内容:

normal  : % normal comment
special : %?description I am even allowed to use % signs 
special : %?default (another value)
normal  : % another normal comment (without a line break!)

那个部分( {!ahead("%?")}? ~[\r\n] )*可以读作如下:如果没有“%”呢?前面,匹配除\r and \n,并执行此操作零次或多次.

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

使用 ANTLR4 识别单行中的多行注释 的相关文章

  • ANTLR4 在导入时找不到语法

    我正在尝试将 ANTLR4 语法拆分为多个文件 以便我可以更轻松地测试它们 我在 java 项目中使用 gradle 作为构建工具 两种语法都单独正确编译 但是当我将导入添加到我的主语法中时 我收到下一个编译错误 错误 110 kaneko
  • AWK 中多行的匹配正则表达式。 && 操作员?

    我不确定 运算符在正则表达式中是否有效 我想做的是匹配一行 使其以数字开头并具有字母 a 下一行以数字开头并具有字母 b 并且下一行 字母 c 该 abc 序列将用作开始读取文件的唯一标识符 这就是我在 awk 中想要的东西 0 9 a n
  • 如何在 Java 中解析这样的 URI

    我正在尝试解析以下 URI http translate google com zh CN en 你 http translate google com zh CN 7Cen 7C E4 BD A0 但收到此错误消息 java net UR
  • 来自 ANTLR 解析树的 Python AST?

    我找到了一个ANTLR4 Python3 语法 https github com bkiers python3 parser 但它会生成一个解析树 该树通常有许多无用的节点 我正在寻找一个已知的包来从该解析树获取 Python AST 这样
  • XAML解析异常

    我有一个简单的 XAML 页面 当它作为 Visual Studio 中任何应用程序的一部分加载时 加载效果良好 但是 当我使用 ClickOnce 部署此应用程序时 出现以下异常 Type System Windows Markup Xa
  • Haskell 中的类型化抽象语法和 DSL 设计

    我正在 Haskell 中设计 DSL 我想要进行赋值操作 像这样的东西 下面的代码只是为了在有限的上下文中解释我的问题 我没有类型检查 Stmt 类型 data Stmt forall a Assign String Exp a Assi
  • XSD 嵌套元素

  • 通过 htaccess 将 PNG 解析为 PHP 仅适用于本地服务器,但不适用于网络服务器

    我用 PHP 创建了一个动态 PNG 图片 为了使用 PNG 扩展名 我创建了一个包含以下内容的 htaccess 文件 AddType application x httpd php png 在我的本地 XAMPP 服务器上 一切工作正常
  • 使用 Boost Spirit 和 Fusion 以关联方式解析结构

    我正在尝试将键值字符串解析为结构 一些键值可能不存在或者顺序不同 所以我想使用boost fusion调整结构 然后解析它at key lt gt 指示 include
  • 使用标志来识别口语

    在我正在做的网络应用程序中 我需要识别人们所说的语言 我想使用标志来做到这一点 但我有一些问题 例如 如果您说法语 则可以放置法国国旗 但如果您说英语 您可以放置 美国或英国国旗或两者的混合 阿拉伯语选择哪个标志 沙特阿拉伯国旗 阿尔及利亚
  • 使用 ANTLR4 识别单行中的多行注释

    我想用 ANTLR4 解析 PostScript 代码 我完成了语法 但是一种特定的语言扩展 由其他人引入 很难被识别 一个简短的例子 1 This is a line comment 2 The next line just pushes
  • 如何使用 Objective-C 解析 JSON?

    我是 iPhone 新手 谁能告诉我解析此数据并获取活动详细信息 名字和姓氏的步骤 error false data activity id 35336 user id 1 user first name Chandra Bhusan us
  • 如何在使用 F# FsYacc 解析期间添加和使用自定义上下文参数?

    我在用着FsLex and FsYacc用于 F 应用程序中的字符串解析 在抽象语法树 AST 创建期间 解析器必须决定如何创建 AST 创建不同的树 抛出异常等 解析器的行为必须取决于几个参数 Here http fsharppowerp
  • 获取有关 Groovy 函数的信息(名称、签名、主体代码)

    我有一个 Groovy 文件 其中包含一堆简单的函数 如下所示 useful functions def myFunc1 String arg println Hello arg def myFunc2 String arg println
  • Dart tryParse double 与 double 字符串

    似乎与 Dart 中使用 tryParse 的方式有些不一致 或者我正在以一种愚蠢的方式处理它 很可能是后者 当我们使用 int tryParse 语句时 如果我们将 10 0 作为双精度值传递给它 我们将期望得到 10 print int
  • 在 PHP 中解析 CFML 标签

    背景 我一直在跑步a site http www gastronomicfightclub com 过去 5 年一直在博客平台上 我选择在自己的服务器上托管该网站 并通过 FTP 发布 我的服务器正在运行 ColdFusion 因此我决定利
  • python 中字符串到 OrderedDict 的转换

    我通过导入集合创建了一个 python 有序字典并将其存储在名为 filename txt 的文件中 文件内容看起来像 OrderedDict 7 0 6 1 5 2 4 3 我需要从另一个程序使用这个 OrderedDict 我这样做 m
  • $.parseJSON() 在有效对象上返回 null

    jsfiddle 链接 http jsfiddle net YmUmp 1 var x Item1 1 Item2 Item3 3 alert JSON stringify x undefined 2 alert parseJSON x 第
  • Xcode 6.3 Parse SDK 1.7.1 PFTableViewCell 错误“具有不兼容的类型”

    My code override func tableView tableView UITableView cellForRowAtIndexPath indexPath NSIndexPath object PFObject gt PFT
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功

随机推荐

  • Jquery:选择器找不到类?

    我正在尝试推进 Jquery autcomplete 功能 我希望 Jquery 自动完成在表中创建新行 到目前为止 这有效 但我希望 Jquery 添加一个删除按钮 因此用户可以删除他添加的项目之一 document ready func
  • 为 Symfony 指定备用后备路径以查找捆绑包的树枝模板

    基本问题 如何让 symfony 在非标准目录中查找 最佳 自定义 Twig 模板来加载捆绑视图 Symfony 文档说默认情况下它会在两个位置查找覆盖 Twig 模板 http symfony com doc current book t
  • Objective-C UILabel 作为超链接

    我正在尝试做一个UILabel一个链接UIWebView 我怎样才能做一个UILabel作为超链接 您可以使用 UITapGestureRecognizer 它将实现与您想要的类似的功能 UILabel myLabel UILabel al
  • 使用 BNB 从合约购买代币时出现问题

    我正在创建这个智能合约 它创建所有代币并将其添加到我的钱包中 然后我将钱包中的所有代币发送到我的合约中 然而 当我从另一个钱包向合约发送 BNB 时 我希望他返回我合约中的一些代币 当我这样做时 传输失败并发送以下错误消息 警告 合约执行过
  • 安装后许可证过期 Microsoft Visual Studio 2015 社区

    我刚刚安装了 Microsoft Visual Studio 2015 Community 安装后登录时出现错误 许可证 预发行许可证 该许可证已过期 我什么都做不了 有人可以帮助我吗 我今天从以下位置下载了安装程序 https www v
  • JavaScript/JQuery:$(window).resize 如何在调整大小完成后触发?

    我这样使用 JQuery window resize function 然而 如果用户通过拖动窗口边缘使其更大 更小来手动调整浏览器窗口的大小 resize上面的事件会多次触发 问题 如何在浏览器窗口调整大小完成后调用函数 以便事件仅触发一
  • 错误优化器参数在 Keras 函数中不合法

    我使用以下代码来计算数据生成质量指标的拟合优度研究的概率标签 from sklearn model selection import StratifiedKFold from sklearn model selection import K
  • 在 Vista 上调用 RPC 时出现“不支持操作”

    我的应用程序使用 Microsoft RPC 进行进程间通信 当两个进程在同一台机器上运行并且一个进程尝试调用声明为 IDL 表示法 的方法时 error status t rpcMethod in pipe byte parameter
  • 为什么我看不到 API 兼容性级别的 .Net 4.6 选项?

    我是 Unity 新手 我想使用最新版本的 Net 似乎 Net 版本最近才升级到 Net 4 6 如本博客文章中所述 https forum unity3d com threads upgraded mono net in editor
  • 如何在 Lua-C API 5.2 中创建类对象?

    我正在使用 Lua 封装 C 函数 使用 Lua 5 2 的 Lua C API include
  • 两个 OnClick 事件重叠

    我在元素内有一个元素 当我单击下面的元素时 我希望打开滑块 当我单击最外面的元素时 我希望滑块关闭 不幸的是 当我单击最外面的元素时 它也会单击下面的元素 有没有办法只单击最外面的元素而忽略下面元素的单击 这些事件在单击时触发并使用 Jav
  • Firebase 托管部署失败

    Running firebase deploy在给我一个超时错误之前会运行几分钟Error ESOCKETTIMEDOUT 我之前已经成功部署了多次 除了项目的前端 用 React 编写 之外 没有更改任何内容 我有一个单独的文件夹 其中包
  • 将图像保存在相机胶卷中并获取资源 URL

    对于我正在开发的应用程序 我使用 UIImagePickerController 拍摄照片并将其存储在相机胶卷中 void imagePickerController UIImagePickerController picker didFi
  • MAMP Pro 3“安装失败。”

    我刚刚购买了 MAMP Pro 3 的升级版 下载了文件 MAMP MAMP PRO 3 0 5 pkg 并继续安装 不幸的是 经过三次尝试 我无法完成安装 文件被写入 最后我收到一条错误消息 安装失败 安装程序遇到错误 导致安装失败 请联
  • 高度并行化的Levenshtein距离算法

    实际上 我必须实现一个字符串比较 最后得到匹配百分比 不仅仅是布尔结果匹配 不匹配 为此 我找到了 Levenstein 距离算法 但现在的问题是性能 例如 我有 1k 个字符串需要相互比较 现在大约需要 10 分钟 对于每个算法 我已经并
  • 从动态 Java 类路径导入 Java 类时出现 Matlab 编译器 MCC 错误

    我怎样才能得到mcc识别来自用户提供的 Java 库的导入 还是简单地忽略无法解析的导入 我有一个使用 Matlab 编译器构建的 Matlab 代码库 但构建正在中断 因为mcc遇到的时候会报错importMatlab 动态类路径上的 J
  • 从 readFile 返回未定义[重复]

    这个问题在这里已经有答案了 我正在尝试让以下代码工作 use strict var fs require fs var fileName readme txt var str fs readFile fileName utf8 functi
  • 如何使用 php 发送服务器错误响应?

    一旦用户点击删除按钮我的 jQuery 脚本要求服务器删除所选项目 现在我想要我的php发送成功或错误响应的脚本 是否有可能触发错误回调万一该项目无法删除 Thanks 我的 jQuery 代码 ajax type post url myA
  • MYSQL - 使用逗号分隔字符串作为变量输入的存储过程

    我希望有人能够提供帮助 我已经创建了我的第一个存储过程 没什么花哨的 但是我遇到了问题 我想给它一个字符串输入 例如 1 2 3 4 5 然后它执行一个简单的操作SELECT FROM TABLE WHERE EAN IN VAR 所以存储
  • 使用 ANTLR4 识别单行中的多行注释

    我想用 ANTLR4 解析 PostScript 代码 我完成了语法 但是一种特定的语言扩展 由其他人引入 很难被识别 一个简短的例子 1 This is a line comment 2 The next line just pushes