编程语言解析器的来源?

2024-05-07

我正在清理我的一个旧项目,该项目计算有关大型软件项目的许多简单指标。指标之一是文件/类/方法的长度。目前,我的代码“猜测”类/方法边界的位置基于非常粗略的算法(遍历文件,维护“当前深度”,并在遇到未加引号的括号时调整它;当您返回到类或方法开始的级别时,认为它已退出)。然而,此过程存在许多问题,并且检测深度何时发生变化的“简单”方法并不总是有效。

为了使其给出准确的结果,我需要使用规范的方式(在每种语言中)来检测函数定义、类定义和深度变化。这相当于编写一个简单的解析器来生成至少包含我希望项目适用的每种语言的这些元素的解析树。

显然,以前已经为所有这些语言编写了解析器,因此似乎我不必重复这项工作(尽管编写解析器很有趣)。是否有一些开源项目为一堆源语言收集现成的解析器库?或者我应该使用 ANTLR 从头开始​​制作自己的?(注意:我很高兴将该项目移植到另一种语言,以利用现有的优秀资源,因此,如果您知道其中一种资源,那么它是用什么语言编写的并不重要。)


如果您想要语言精确的解析,特别是面对宏和预处理器条件等语言复杂性,您需要完整的语言解析器。这些实际上需要大量的工作来构建,并且大多数语言都不能很好地适应周围各种类型的解析器生成器。大多数语言解析器的作者对其他语言也不感兴趣。他们倾向于选择一些解析器生成器,这些生成器在开始时显然不是一个巨大的障碍,为他们想要的特定目的实现解析器,然后继续前进。

结果:很少有语言定义库是使用单一形式主义或共享基础定义的。 ANTLR 人群维护着较大的集合之一,恕我直言,尽管据我所知,大多数解析器都没有完全的生产能力。总是有 Bison,它已经存在了足够长的时间,所以你会期望在某个地方收集一个语言定义库,但我从未见过它。

在过去的 15 年里,我一直在定义程序分析和转换的基础机制,并构建了另一个这样的库,称为DMS 软件再造工具包 http://www.semanticdesigns.com/Products/DMS/DMSToolkit.html。它具有适用于 C、C++、C#、Java、COBOL(IBM 企业版)、JCL、PHP、Python 等的生产质量解析器。您的意见当然可能与我的不同,但这些解析器每天与 DMS 一起使用来执行大规模更改任务在大量代码上。

我不知道还有其他任何语言定义集是成熟的并且构建在单一基础上的......IBM 的编译器可能就是这样的一个集,但 IBM 不提供机器或语言定义。

如果您想做的只是计算简单的指标,那么您可能可以只使用词法分析器和临时嵌套计数(如您所描述的)。即使在大多数情况下使其正常工作也比看起来更困难(查看 Python、Perl 和 PHP 的疯狂字符串语法)。总而言之,即使只是定义一个准确的词法分析器,C 语言的工作量也令人惊讶:我们有几千行复杂的正则表达式来涵盖您在 Microsoft 和/或 GNU C 中找到的所有奇怪的词素。

由于 DMS 为许多语言提供了一致定义的成熟解析器,因此 DMS 也为相同语言提供了一致定义的成熟词法分析器。我们实际上构建了一个源代码搜索引擎 (SCSE) http://www.semanticdesigns.com/Products/SearchEngine它提供了对多种语言的大量代码的快速搜索,其工作原理是对遇到的语言进行词法分析并对这些词素进行索引以进行快速查找。 SCSE 恰好也计算您正在讨论的指标类型,因为它索引代码库,几乎按照您描述的方式,只是它有这些语言准确的词法分析器可供使用。

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

编程语言解析器的来源? 的相关文章

  • 读取输入文件的部分内容

    我想读取 C 中的输入文件 其结构 或缺乏 将类似于一系列带有以下内容的行 文字 数字 例如 input1 10 input2 4 set1 1 2 set2 1 e3 我想把这个号码从队列中取出 然后把剩下的扔掉 数字可以是整数或双精度数
  • VBA COM 库中的这些 _B_var_Xxxxx 和 _B_str_Xxxxx 成员到底是什么?

    想象一下以下函数调用 foo UCase bar 我正在解析这段代码 并确定UCase是一个函数调用 现在我想将该函数调用解析为定义它的 COM 库中函数的声明 这个想法是实现一个代码检查来确定何时Variant当使用内置函数时String
  • 导入数据期间解析日期格式的最佳方法

    我创建了在数据导入 400 K 记录 期间解析视图不同日期格式的方法 我的方法捕获 ParseException 并尝试在不同时使用下一种格式解析日期 问题 在数据导入期间设置正确的日期格式是更好的方法 更快 吗 private stati
  • C 或 C++ 中是否有轻量级的多部分/表单数据解析器? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在考虑将多部分表单数据解析集成到 Web 服务器模块中 以便可以减轻后端 Web 应用程序 通常用动
  • 如何将带小数点的字符串解析为双精度型?

    我想解析一个字符串 3 5 到一个双倍 然而 double Parse 3 5 产量 35 和 double Parse 3 5 System Globalization NumberStyles AllowDecimalPoint 抛出一
  • 编程语言解析器的来源?

    我正在清理我的一个旧项目 该项目计算有关大型软件项目的许多简单指标 指标之一是文件 类 方法的长度 目前 我的代码 猜测 类 方法边界的位置基于非常粗略的算法 遍历文件 维护 当前深度 并在遇到未加引号的括号时调整它 当您返回到类或方法开始
  • Java 中的递归下降解析器

    我想在序言中说这是我三年级编程语言课的家庭作业 我正在寻求一些帮助 我的作业如下 截止日期 2013年2月22日晚上11点55分提交 请将以下内容上传到CMS 1 源代码2 程序执行的屏幕截图 包括您使用的输入文件 使用您喜欢的任何编程语言
  • 在Python中从feedparser解析不同的日期格式?

    我正在尝试通过以下方式获取两个不同 RSS 提要中的条目的日期feed解析器 http feedparser org 这是我正在做的事情 import feedparser as fp reddit fp parse http www re
  • 如何使用 SAX Java 解析器读取注释文本

    我只想使用 Java 中的 SAX 解析器读取 XML 文件中对象标记的注释 这是我的文件的摘要
  • Parse::RecDescent 语法未按预期工作

    我所能做的就是 STRING PARAMS VARIABLE 和 FUNCNAME FUNCTION 似乎有问题 但我就是看不到它 use strict use Parse RecDescent RD ERRORS 1 Make sure
  • iOS 解析如何通过 URL 下载文件

    我正在将 parse 用于我的聊天应用程序 当我上传文件时 我保留该 url 并将该 url 发送给其他用户 然后其他用户可以通过该 URL 下载文件 这是我上传文件的代码 void uploadBlob NSData blob fileN
  • 用 C++ 生成 AST

    我正在用 C 制作一个解释器 到目前为止我已经有了词法分析器来生成标记 问题是我不确定如何生成 行走 解析树 我正在考虑使用数组数组来制作解析树 但我不确定如何以正确的顺序将标记实际插入到解析树中 我不确定是自上而下 左右还是自下而上 左右
  • 将人类日期(当地时间 GMT)转​​换为日期

    我正在服务器上工作 服务器正在向我发送 GMT 本地日期的日期 例如Fri Jun 22 09 29 29 NPT 2018在字符串格式上 我将其转换为日期 如下所示 SimpleDateFormat simpleDateFormat ne
  • 将 Java 字符串转换为 sql.Timestamp

    收到以下格式的字符串 YYYY MM DD HH MM SS NNNNNN 时间戳来自 DB2 数据库 我需要将其解析为 java sql Timestamp 并且不丢失任何精度 到目前为止 我一直无法找到现有的代码来解析远至微秒的数据 S
  • 用于遇到 [...] 的 Haskell Parsec 解析器

    我正在尝试使用 Parsec 在 Haskell 中编写一个解析器 目前我有一个可以解析的程序 test x 1 2 3 end 执行此操作的代码如下 testParser do reserved test v lt identifier
  • 有一种简单的方法可以忽略时间戳来区分日志文件吗?

    我需要比较两个日志文件 但忽略每行的时间戳部分 确切地说是前 12 个字符 有没有一个好的工具 或者一个聪明的 awk 命令 可以帮助我 根据您使用的 shell 您可以改变方法 Blair https stackoverflow com
  • Java 库有 parseInt、parseLong、parseDouble 等接受默认值并且不抛出异常吗?

    我喜欢中的建议java中的String到Int 可能是坏数据 需要避免异常 https stackoverflow com questions 174502 string to int in java likely bad data nee
  • 如何在 Antlr4 中为零参数函数编写语法

    我的函数具有参数语法 如下面的词法分析器和解析器 MyFunctionsLexer g4 lexer grammar MyFunctionsLexer FUNCTION FUNCTION NAME A Za z0 9 DOT COMMA L
  • 正则表达式,如果模式在引号中则忽略模式

    编写一个非常简单的脚本解析器作为学校项目的一部分 虽然这不是必需的 但我很好奇是否可以仅使用正则表达式来完成 语法类似于 ASP 其中脚本以 结尾 它只支持一个命令 pr 与echo或Response Write相同 现在我正在使用这个正则
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析

随机推荐

  • 配置Apache将SSL客户端证书发送到后端服务器

    我想配置 Apache 以便它接收客户端证书 并将其传递到另一台服务器 我在用着 Windows 上的 Apache 2 0 65 后端服务器是基于 apache 的解决方案 IBM HTTP Server 我尝试了这个配置
  • 使用 Bloomberg .Net API 的每小时数据

    我正在努力解决使用 Net API 3 0 从 Bloomberg 获取每小时开盘价 最高价 最低价和最后价格快照的逻辑 我已经用谷歌搜索了很多次 但没有运气 对此的任何帮助将不胜感激 我试图在 Bloomberg Net API C 中找
  • Google 测试中没有模拟的 EXPECT_CALL

    有没有办法通过 GoogleTest for c 测试函数调用而不创建模拟对象 例如我们有以下生产代码 if a method x 我想测试一下是否method在这种情况下将被调用a是真的并且a是假的 我想构建一个与 Google Test
  • 启动应用程序时,“npm start”和“node app.js”之间的区别?

    我已经使用命令安装了一个应用程序express new filename 我刚刚了解到您可以使用以下方式启动应用程序 npm start 到目前为止我已经使用过 node app js 启动我的服务器 有人知道两者有什么区别吗 谢谢 来自m
  • Highcharts 工具提示裁剪

    我正在使用高图表 但遇到了较大的工具提示在 SVG 外部元素处被裁剪的问题 如下图所示 选项useHTML工具提示和 xAxis 设置为 true 因为我正在应用一些自定义 CSS 这些元素 有没有办法让工具提示不被裁剪 我的 highch
  • AngularJS 货币过滤器:如果金额中没有美分,我可以删除 .00 吗?

    我正在关注这个 http docs angularjs org api ng filter currency http docs angularjs org api ng filter currency当我在字段中输入 1234 56 时
  • 使用 JScrollPane 和 JLayeredPane 进行 Swing GUI 设计

    我想要一个如下图所示的 GUI 设置 The JLayeredPane应始终具有相同的大小 但是JPanel和JScrollPane可以改变尺寸 我需要JScrollPane能够显示JLayedPane通过单击箭头 如果JPanel and
  • 具有桌面应用程序安全性的 OAuth2

    我有一个 Electron 应用程序 它基本上是一个 Google Drive 客户端 我打算使用 OAuth 2 但是 Google API 要求我在生成 client secret 的地方注册我的应用程序 由于这是一个桌面应用程序 因此
  • 如何检查范围内的元素是否应该移动?

    有一个类似的问题 检查范围内的元素是否可以移动 https stackoverflow com questions 56096579 check if elements of a range can be moved 我认为其中的答案不是一
  • 在 makefile 中,当我在 bash 函数内部使用 if 语句时,它会抛出错误

    在 makefile 中 当我在 bash 函数内部使用 if 语句时 它会抛出错误 test foo if a a then echo 1 fi foo hello ERROR bin sh 1 未找到 或与一个 test foo if
  • 编译错误:表达式非法开始

    我正在学习 Java 游戏方面 我买了一本书 里面有一些代码 我尝试复制并测试它 唯一的问题是 当我尝试编译它时 它会出现错误 C Users James Desktop Java gt Javac GamePanel java GameP
  • 更改首选项(设置)后,显示设置的文本不会更新

    我将尝试解释一个简单的应用程序场景 我的应用程序直接进入 主视图 在这个主视图中我插入了一个TextView它显示通过以下方式创建的当前设置PreferenceManager 为了简单起见 假设我的设置中有一个复选框 当我第一次启动我的应用
  • 将变量分配给 document.getElementById().Innerhtml 不起作用

    请参阅下面的代码 var text yuppie kkkoseh watchdog var messageIndex 0 function looptext var MessageElement document getElementByI
  • 在 O(n) 时间内运行的指数乘法算法?

    我正在读一本算法教科书 我被这个问题难住了 假设我们要计算值 x y 其中 x 和 y 为正数 分别具有 m 和 n 位的整数 解决该问题的一种方法是执行 y 1 乘以 x 你能给出一个仅使用 O n 乘法步骤的更有效的算法吗 这会是一个分
  • 从 html 链接在移动设备上打开应用程序

    我有一个包含我的社交媒体帐户的 html 页面 我希望当我单击这些链接时可以转到我在这些社交媒体应用程序上的个人资料 例如 Skype a href My Skype a 当我在移动设备上点击此链接时 它会打开 Skype 并转到我的帐户
  • Mac 监听事件:复制到粘贴板

    我正在阅读 NSPasteboard 然后想找到 我试图找到正确的通知方法来侦听数据复制到剪贴板的事件 我还试图找到复制到剪贴板的数据的文件路径 这将是一个粘贴板对象 如果我从浏览器中的页面复制文本 我会尝试找出如何获取复制文本的页面的 U
  • 高图表重叠类别标签

    我需要有关 xAxis 类别标签问题的帮助 当没有空间容纳所有类别标签时 它们就会挤在一起并相互重叠 我搜索过是否可以找到某种方法来确保这种情况不会发生 首先我寻找滚动解决方案 然后进行某种缩放 最后我尝试使用 staggerLines 问
  • 具有 TINYTEXT 列的 CREATE TABLE 语句中出现语法错误 1064?

    这是我到目前为止的 MySQL 代码 CREATE DATABASE bankbase USE bankbase CREATE TABLE clienttable ClientID SMALLINT 15 NOT NULL DEFAULT
  • 分支 ASP.NET Core 管道身份验证

    我的应用程序当前正在使用基本身份验证 但我想转换到 OAuth 因此在短时间内需要使用两种类型的身份验证 有没有办法像这样分支我的 ASP NET Core 管道 public void Configure IApplicationBuil
  • 编程语言解析器的来源?

    我正在清理我的一个旧项目 该项目计算有关大型软件项目的许多简单指标 指标之一是文件 类 方法的长度 目前 我的代码 猜测 类 方法边界的位置基于非常粗略的算法 遍历文件 维护 当前深度 并在遇到未加引号的括号时调整它 当您返回到类或方法开始