语义词法分析器谓词性能

2024-03-26

我有一个词法分析器为传递给词法分析器的宏字符串的动态列表创建 MACRO 标记。我在最顶层的词法分析器规则中使用了语义谓词来实现此功能:

MACRO: { macros != null && tryMacro() }? .;

Where tryMacro()只是检查是否有任何宏字符串与输入序列匹配。

这种方法的性能非常糟糕,经过一些研究,我尝试将词法分析器规则更改为以下内容:

MACRO: . { macros != null && tryMacro() }?;

这极大地提高了性能,但我不太明白为什么。 :) 由于'.'匹配任何字符,语义谓词规则应该被调用与以前一样多的次数,不是吗?有人可以解释这种行为吗?


原因很简单:如果将谓词放在开头,词法分析器将对其进行评估以决定是否MACRO规则应适用。如果你把它放在最后,它只会在有潜在匹配项时才执行检查MACRO rule.

Since MACRO is very通用的,我想你把它放在规则的末尾,并且由于优先规则 https://stackoverflow.com/a/46267981/3764814肯定会被尝试的last。它只能匹配单个字符标记,因此更精确的规则将是优先考虑的。

If the MACRO规则被更优先的规则取代,它不会被考虑,并且您的谓词也不会被调用。

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

语义词法分析器谓词性能 的相关文章

  • ANTLR4:TokenStreamRewriter 输出没有正确的格式(删除空格)

    我正在使用 Antlr4 和 java7 语法 source 用于修改输入 Java 源文件 更具体地说 我使用 TokenStreamRewriter 类来修改一些标记 以下代码是显示如何修改令牌的示例 public class Test
  • Antlr4 C# 目标和生成文件的输出路径

    我有一个带有 Antlr3 语法文件的 C 解决方案 我正在尝试升级到 Anltr4 事实证明语法是最简单的部分 它变得更好 大小也减少了三分之一 事实证明 生成解析器是棘手的部分 在旧的解决方案中 我只是在语法文件更改时运行 AntlrW
  • ANTLR4:如何读取字符串中的双引号转义双引号?

    在ANTLR v4中 我们如何像VBA中那样解析这种带有双引号转义双引号的字符串 对于文本 some string with john doe in it 目标是识别字符串 some string with john doe in it 是
  • ANTLR 词法分析器如何消除其规则的歧义(或者为什么我的解析器会产生“输入不匹配”错误)?

    Note 这是一个自答问题旨在为 ANTLR 用户最常犯的错误之一提供参考 当我测试这个非常简单的语法时 grammar KeyValues keyValueList keyValue keyValue key IDENTIFIER val
  • Antlr4 无法正确识别 unicode 字符

    我有非常简单的语法 尝试将 与标记 E CODE 相匹配 我已经使用 TestRig 工具 带有 tokens 选项 对其进行了测试 但解析器无法正确匹配它 我的输入文件采用无 BOM 的 UTF 8 编码 并且我使用了 ANTLR 版本
  • 在通过 HomeBrew 安装的 macOS 上设置 ANTLR 的 CLASSPATH

    下列的这个问题 我通过 HomeBrew 安装了 ANTLR brew install antlr 它安装在 usr local Cellar antlr
  • 为什么在将令牌分配给通道时出现错误?

    我的 g4 文件中有以下代码 lexer members public static final int WHITESPACE 1 public static final int COMMENTS 2 WS t f gt channel W
  • 如何强制ANTLR解析所有输入CharStream

    我正在使用 ANTLR4 来解析语法文件 当我使用 BaseErrorListener 检测错误时 遇到了问题 当遇到非法输入字符串时 ANTLR会自动匹配相应的分支 然后忽略后续流字符 即使它包含错误 我想检测这个错误 这是我的 g4 文
  • antlr4:ATN 版本 2 预计 3

    当尝试使用生成的语法和词法分析器时 我得到 org antlr v4 runtime atn ATN 无法使用版本 2 预期为 3 反序列化 ATN 怎么了 您的解析器是使用 ANTLR 4 0 生成的 但您尝试使用 ANTLR 4 1 执
  • 使用 ANTLR4 解析公式

    我正在尝试使用 ANTLR4 将数学公式解析为 LaTeX 的子集 例如它应该解析 a 4 b 10 to frac a 4 b cdot 10 我的简单语法创建了一棵这样的树 现在我正在尝试实现解析树侦听器 以在遍历树时以某种方式构造 L
  • Antlr 外部输入

    我有一个语法文件 BoardFile g4 其中包含 仅相关部分 grammar Board Tokens GADGET squareBumper circleBumper triangleBumper leftFlipper rightF
  • ANTLR4 左递归错误

    我的 ANTLR4 语法在文件中power g4这是 assign id expr id A B C expr expr term expr term term term term factor term factor factor fac
  • ANTLR4 RegEx 词法分析器模式

    我正在为 XSD 内的 RegEx 开发一个 Regex 解析器 我之前的问题描述如下 ANTLR4 解析正则表达式 https stackoverflow com questions 34177478 antlr4 parsing reg
  • antlr 文字字符串匹配:我做错了什么?

    我已经使用antlr 3天了 我可以解析表达式 编写侦听器 解释解析树 这是梦想成真 但后来我尝试匹配文字字符串 foo 但失败了 我可以找到很多声称可以做到这一点的例子 我都试过了 所以我创建了一个小项目来匹配文字字符串 我一定是在做一些
  • 使用 ANTLR 通过 Python 解析一些 Java 代码

    我想在 Python 中使用 ANTLR 构建一个 Java 解析器 我从 ANTLR 存储库下载了语法 Lexer https github com antlr grammars v4 blob master java java Java
  • ANTLR4 相当于什么!在词法分析器规则中?

    我正在努力将旧的 ANTLR 2 语法转换为 ANTLR 4 但我在字符串规则方面遇到了问题 STRING r n 这创建了一个STRING其文本包含字符串内容的标记 但是不含开始和结束引号 因为 引号文字后面的符号 ANTLR 4 扼流圈
  • Antlr4 语言翻译 - 将模板逻辑与访问者类分开?

    我正在考虑实用地将大量相对简单的 TSQL 代码转换为 Groovy 代码 肯定有很多原因 但驱动因素只是想看看是否可以完成 并在此过程中了解编译器 语法 等 Antlr4 似乎是解决这个问题的理想工具 Java 是一个优点 标记化 解析
  • ANTLR 语法也可以识别数字键和整数

    我正在尝试创建一个 ANTLR 语法来解析可选地具有重复计数的键序列 例如 a b c r5 表示 重复键 a b 和 c 五次 我有语法工作KEYS a z A Z 但是当我尝试添加数字键时KEYS a z A Z 0 9 输入表达式如
  • 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 上面的语法默认不提供任何解析规则来获取预处理器语

随机推荐

  • 如果左侧包含 null 并且右侧包含值,则在 sql 中向左移动单元格

    在 Sql 中 我得到如下格式的结果 我总共有 6 列 第一行第 6 列包含该值 第二行第 5 和第 6 列包含该值 但如果前一列不包含该值 我需要检查每个单元格 这意味着我需要在第一列中包含该值 实际结果 a b c d e f 1 1
  • Nodejs、multer、aws S3

    如何应用 uuid 和日期 以便存储在数据库中的文件名和存储在 S3 存储桶中的文件名相同 在当前的实现中 即使帖子是在几小时后发布的 uuid 和日期也始终相同 有人可以帮忙吗 真的很感激 const s3 new AWS S3 acce
  • 基于定义的时间间隔(bin)的时间序列平均值

    这是我的数据集的示例 我想每 10 秒根据时间 即 ts 计算一次 bin 平均值 您能否提供一些提示以便我可以继续 就我而言 我想平均每 10 秒的时间 ts 和 Var 比如我会得到Var和ts从0到10秒的平均值 我将得到另一个 Va
  • 锐化图像以检测纸上印有“X”对象的边缘/线条

    我正在使用 python 和 opencv 我的目标是检测用树莓派相机拍摄的图像中的 X 形碎片 该项目是我们预先打印井字游戏板 并且每次将新棋子放置到板上时都必须对板进行成像 带有墨水印章 然后输出表明什么类型的棋子 如果有的话 位于井字
  • awk -cut 如何删除带有字段分隔符的第二列

    我有一个 csv 文件 其中的数据如下 o 022344527 o lonyfoe o Joe o Joe o Otieno 我正在尝试删除第二列 Output o lonyfoe o Joe o Joe o Otieno 有任何想法吗 这
  • Scala 中的有效标识符字符

    我觉得很困惑的一件事是知道我可以在方法和变量名称中使用哪些字符和组合 例如 val 1 legal val 1 illegal val 1 legal val 1 legal val 2 1 illegal val 2 1 legal va
  • cuda简单应用程序适用于32位而不适用于64位

    我的简单 cuda helloworld 应用程序在 Windows 10 上使用 Visual Studio 2015 社区构建 32 位时运行良好 但是 如果我在 64 位中构建它 则不会执行 GPU 特斯拉K40c 工具包 CUDA
  • 在 application.yml 中设置根日志记录级别

    我将 application properties 与 Spring Boot 1 3 M1 一起使用 并开始将其转换为 yaml 文件 因为它变得越来越复杂 但我在将其转换为 yaml 时遇到问题 logging level WARN l
  • 计算地图:提前计算价值

    我有一个计算地图 http guava libraries googlecode com svn trunk javadoc com google common collect MapMaker html makeComputingMap
  • Firefox 中 CSV 文件的数据 URI 未添加 .csv 扩展名

    我的 javascript 文件中定义了一个 下载文件 href downloadTag html a href Download a 在 Chrome 中 它按预期工作 即当我单击此下载链接时 它给出的文件名为 download csv
  • inflate 后 findViewById 在自定义 View 中返回 null

    我有一个习惯RelativeLayout我在其中填充了一个 xml res 文件 如果我在 xml 文件中使用自定义布局并将其设置为 contentview 则效果很好 但是如果我尝试将其添加到代码中new LocationItem thi
  • 通过指针的二维数组

    我想创建一个存储排列序列的动态数组 这样 order 0 1 2 3 order 1 2 1 3 order 2 2 3 1 假设 order m n m 排列数 n 项数 m 和 n 是实时识别的 我做了下面的操作 发现指针地址重叠 导致
  • 反应式编程和函数式反应式编程之间的区别

    我最近一直在对反应式编程进行一些研究 我发现很难找到反应式编程和反应式编程之间差异的良好描述 功能性 反应性的 反应式编程是否只是使用函数式方法 范式而不是使用声明式或面向对象范式来实现 函数式响应式编程 FRP 是一种具有特定语义的特定编
  • 扩展 React.js 组件

    我最欣赏 Backbone js 的事情之一是继承的工作方式简单而优雅 我开始掌握 React 但在 React 中找不到任何类似于此 Backbone 代码的内容 var Vehicle Backbone View extend meth
  • 使用 pdfbox 调用 acroform.getFields() 时获取 null

    我试图以 pdf 形式获取所有可用字段 但遇到了NullPointerException打电话时acroform getFields 使用 PDFBox Sample pdDoc PDDocument load fileName PDAcr
  • // doxygen 中的注释

    我有一个 C 项目 需要使用 doxygen 进行记录 它拾取由 Visual Studio 自动生成的评论 但不幸的是它没有正常显示 评论 是否有我缺少的配置设置 或者这是不可能的 被称为XML 文档注释 http msdn micros
  • 无法对非静态方法进行静态引用

    我已经搜索了这个问题并找到了很多关于它的答案 但是我不理解它们 我想对我自己的代码进行澄清 所以希望它有意义 我正在尝试在 main 方法中调用 PrintList 方法 但我收到这个错误 无法从 Stack 类型对非静态方法 PrintL
  • 如何在 webgram 中监听 Telegram 消息/推送通知

    我需要通过 Telegram API 接收最新的 telegram 更新 看来 webogram 是该任务唯一最新的 javascript 库 我之前使用的是 telegram link 它通过 TCP 很好地完成了任务 我想知道 webo
  • 如何在不使用 for 循环或 try 语句的情况下有效地拆分一个字符串中的货币符号和数字

    我有一个像这样的字符串 200 000 000 or Yan300 000 000 我想拆分货币和数字 并输出一个元组 200000000 没有 在数字字符串中 目前我正在使用以下脚本 该脚本正在运行 def splitCurrency c
  • 语义词法分析器谓词性能

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