使用 Gold Parser 解析项目和包文件 --“IdList”需要帮助

2024-01-20

我正在涉足对象帕斯卡引擎 http://goldparser.org/engine/1/pascal/index.htm(作者:Rob van den Brink)并且看起来(除了一些小的且容易纠正的错误)它适用于 Delphi 单元文件。

但是,它在解析 Project 时遇到问题(.dpr) 和包 (.dpk) 文件;这个问题基本上可以归结为“使用”在单元和项目中可以拥有的内容(以及“包含”子句在包中可以拥有的内容)之间的差异。

让我举一些简单的例子:

在单元 (.pas) 文件中,“uses”子句可以是这样的

uses
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  StdCtrls,
  ExtCtrls,
  ComCtrls;

而在项目 (.dpr) 文件中

uses
  Forms,
  UnitDemoMain in 'UnitDemoMain.pas' {Form1},
  SomeUnit in '..\SomeUnit.pas',
  SomeOtherUnit;

然而,相同的功能(以“包含”的名称)出现如下:

contains
  OneUnit in 'OneUnit.pas',
  AnotherUnit in '..\AnotherUnit.pas';

我的语法文件的问题(来自上面的链接)是它只处理最简单的情况(即“使用”发生在单元文件中的方式),并为其他情况抛出错误。

我猜它归结为“IdList”在语法文件中的定义方式,如下所示:

<IdList> ::= <IdList> ',' <RefId>
| <RefId>

那么,我的问题是:如何更改此函数,以便它可以处理其他替代方案(如项目和包文件中所示),即:

UnitDemoMain in 'UnitDemoMain.pas' {Form1},
OneUnit in 'OneUnit.pas';

我自己还没有使用过 Gold 包,但是我已经使用过 Yacc 相当多了;其语法布局略有不同,但原理是相同的。

对于初学者,我会尝试修改 Delphi 语法如下:

Change

<UsesClause>        ::= USES <IdList> ';'
              | SynError

to

<UsesClause>        ::= USES <UnitList> ';'
              | SynError

and add

<UnitList>      ::= <UnitList> ',' <UnitRef>
              | <UnitRef>

<UnitRef>       ::= <RefID>
              | <RefID> IN <StringLiteral>
!                 | <RefID> in <StringLiteral> Comment Start <RefID> Comment End

我使用感叹号注释掉的行最初是为了在您的示例中处理此构造:

  UnitDemoMain in 'UnitDemoMain.pas' {Form1},

然而,Gold 的 Builder 似乎将左大括号字符和右大括号字符 { } 视为一种特殊情况,这似乎阻止它们被用作除了包围注释之外的任何其他用途;我一直无法找到将它们用作语法规则的一部分的方法。此更改的结果应该是“{Form1}”作为注释被简单地忽略,并且示例构造与之前的变体(“ IN StringLiteral”)相匹配。

Fwiw,Gold 看起来相当不错,除了一些问题,包括

  • ReadMe 中提到的限制是它只能处理字符 0..127 和

  • 它的解析器生成器(v.5.2)在使用附带的 D7 示例语法(在我建议的更改之前)运行时抱怨第 82 行/状态上的无效起始符号和词法错误。也许我错过了一些东西......

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

使用 Gold Parser 解析项目和包文件 --“IdList”需要帮助 的相关文章

  • 如何使用用户输入来寻址 Pascal 中的特定变量(Eval/Exec?)

    我正在尝试在分形程序中做一些非常具体的事情隆起7X http apophysis 7x org 使用的脚本语言是Pascal 该项目是用德尔福写的 https svn code sf net p apophysis7x svn trunk
  • Delphi 2007 中的 HelpInsight 文档

    我正在使用 D2007 并尝试使用 HelpInsight 功能 自 D2005 起提供 来记录我的源代码 我主要对让 HelpInsight 工具提示正常工作感兴趣 通过各种网上冲浪和实验 我发现了以下内容 使用三斜杠 注释样式比其他记录
  • 如何将 TGifImage 中的帧提取为位图?

    下面的演示尝试在表单的画布上绘制 GIF 这不起作用 图像不会前进 如何让它发挥作用 procedure TForm1 FormCreate Sender TObject begin GIF TGIFImage Create GIF Loa
  • 在 SQLite 数据库中存储日期时间值的最佳方式(Delphi)

    我将把日期时间值存储在 SQLite 数据库中 使用 Delphi 和 DISqlite 库 数据库的本质是它永远不需要在计算机或系统之间传输 因此互操作性不是一个限制 相反 我的重点是阅读速度 日期时间字段将被索引 我将对其进行大量搜索
  • 如何读取注册表项的默认值

    我有一个 Delphi XE2 项目来使用注册表项进行某些操作 所以我定义了以下代码 procedure TMainForm BitBtn01Click Sender TObject var RegistryEntry TRegistry
  • 如何将数据库查询的行转换为 XML 文件?

    我正在开发一个 Delphi 应用程序 该应用程序需要从一段工作中获取行并将其转换为单个 XML 文件 以便上传到第三方 Web 服务 有没有可用的组件或库可以做到这一点 如果不是 那么构建 DB2XML 转换器的最佳代码方法是什么 我注意
  • 如何从 Delphi 中的函数返回对象而不导致访问冲突?

    我有一个返回 TStringList 的 delphi 函数 但是当我返回一个值并尝试使用它时 我收到一个访问冲突错误 即 myStringList FuncStringList myStringList Items Count lt Th
  • 是否可以声明长度受限且不从 0/1 开始的字符串类型?

    在 Delphi 中 可以声明整数值的子范围 例如 type myInt 2 150 它将 myInt 类型的值限制为 2 到 150 之间的值 但是如果我想限制字符串的长度怎么办 如果我写 type myString string 150
  • 如何使用 Gmail 的 SMTP 和 Indy 10 发送电子邮件?

    我正在使用 Delphi 2009 和 svn 中最新的 Indy 10 通过 SMTP 发送电子邮件 但它不适用于 Gmail Google Apps 托管域 当我尝试发送电子邮件时 我收到 必须首先发出 STARTTLS 命令 我尝试用
  • 对象的引用计数

    在我的代码中 我使用一个小的数据存储类 它是在不同的地方创建的 为了避免内存泄漏并简化事情 我想使用引用计数 所以我这样做了 type TFileInfo class TInterfacedObject IInterface 并删除了我对
  • 通过套接字发送动态数组(在记录内)?

    我正在尝试直接使用 SendBuf 将记录从服务器传输到客户端 但是 该记录有一个动态数组的成员 并且我在某处 在 SOF 中 读到 发送记录时 成员必须是静态的 固定长度 但问题是 我无法确定如何我会 将来 发送许多论点 我怎么解决这个问
  • 如何在iOS的Delphi程序中使用IPv6协议

    我尝试在我的移动程序中使用 IPv6 协议 我的服务器位于 NAT 后面的 LAN 内 在服务器上我使用IP端口3000 我已经组织了从路由器端口 45500 到服务器端口 3000 的虚拟服务器 端口转发 在服务器上 我运行 ipconf
  • 在 Delphi 或 C++ Builder 中使用 Chromium Edge WebView2 [重复]

    这个问题在这里已经有答案了 既然 Microsoft Chromium Edge 已经最终确定 是否可以在 Delphi 或 C Builder 中使用它 据我了解 它是基于WebView2成分 是否有一个组件 例如TWebView2或者E
  • 从 Delphi VCL 样式获取特定字形

    我想从 VCL 样式获取特定的位图 并将其设置为按钮上的图像 它实际上是帮助问号 在位图样式编辑器中是来自表单的 btnHelp 图像 要从 VCL 样式获取视觉元素 字形 您必须使用GetElementDetails和TCustomSty
  • 如何在表单上绘制半透明图像?

    我想在 Delphi 窗体上绘制半透明图像 但由于某种原因它不起作用 Here is the original PNG border is semi transparent 我将图像加载到TImage object Image1 Trans
  • Delphi 中表单分发与其生命周期相关的接口对象的安全方法?

    我有一个 Delphi 表单 它提供接口对象背后的功能 代码的其他部分也通过属于该表单的属性获取引用 我无法将接口功能委托给子对象 因为太多的功能是由表单上的控件 组件提供的 我无法使用 TAggregateObject 或 TContai
  • 如果加载 dll 找不到依赖项,有什么方法可以捕获错误吗?

    我正在编写一个 Windows 32 位程序 可以使用多个可能的 dll 之一 所以它尝试依次加载每个 dll 使用SysUtils SafeLoadLibrary如果加载成功 它就会使用该 dll 不幸的是 其中一些 dll 静态链接到其
  • MainFormOnTaskbar + 工具提示导致焦点窃取

    我使用 Delphi XE2 构建了下面的代码 它创建 Form1 Form1 立即创建 Form2 的实例 当我按下 Form2 上的按钮时 会创建第二个 Form2 现在 如果我将鼠标悬停在第二个 最上面的 Form2 上的按钮上 并等
  • Delphi Prism 中 TStringList 的替代品。

    我正在将用 Delphi 2007 Net 编写的应用程序迁移到 Delphi Prism 哪个是替换 TStringList 和 TStrings 类的最佳选择 提前致谢 Bye 只需使用 NET 框架中内置的 List 类型 或者字符串
  • 为什么 TImage 旋转我的图像?

    编写一个移动应用程序 它从安全网站提取图像 如下所示 第一个图像 提取不正确 注意网络版本与移动版本 第二个图像在网站上正确显示 但 Delphi TImage 由于某种原因正在旋转它我不明白为什么 旋转设置为 0 并且在 TImage 组

随机推荐

  • Selenium WebDriver 默认使用什么配置文件?

    Selenium WebDriver 又名 Selenium 2 从哪里获取打开 FirefoxDriver 时使用的匿名配置文件 如果它使用 Firefox 的默认值 appdata roaming mozilla firefox pro
  • 如何在 linq to xml 中交换两个 XML 元素

    我想交换两个 xml 元素 我该怎么做呢 这是代码 我尝试了解决方案here https stackoverflow com questions 3695806 linq to xml what is the most effective
  • 在Django中引用View/Template中的多个Model

    我正在使用 Python Django 迈出第一步 并在一个 Django 项目中编写了一个包含多个 Django 应用程序的示例应用程序 现在我添加了另一个名为 仪表板 的应用程序 我想在其中显示来自不同应用程序的数据 目前我仍然使用这个
  • 如何在Windows中使用pygame打开相机?

    我想在 Windows 7 机器上使用 pygame 模块用 Python 打开相机 但它不起作用 我以前用过 dev video0 这是Linux中的读取设备 pygame 文档仅展示了如何在 Linux 中打开相机设备 我使用的是 py
  • 在 React 中测试 API 调用 - 状态未更新

    我想测试组件中的 API 调用后我的状态是否更新 我有一个方法可以说method1 在该方法中 它调用fetch并将状态设置为结果 方法如下 method1 gt if this state state1 fetch api then re
  • 使用 URL 参数自动填充表单并自动提交

    我想使用 URL 参数自动填充以下表单 例如使用如下 URL example co uk example php acct wirelesslogicde pwd jenkins 如果可能的话 我也希望自动提交 我该怎么做
  • 如何判断TBucketList的桶数

    我一直在使用 TBucketList 和 TObjectBucketList 来满足我的所有哈希需求 但从未尝试过切换存储桶的数量 我隐约记得这在数据结构类中意味着什么 但是有人可以详细说明 Delphi 中这个特定类的细微差别吗 The
  • 是否保证handle_info在超时0的情况下在init之后立即执行?

    我收到一个奇怪的错误报告 这让我认为在 gen server 初始化之前正在执行一些调用 这是初始化代码 init ResourceId gt process flag trap exit true ok not initialized R
  • 如何使用任何库在Python中将RTF字符串转换为纯文本[重复]

    这个问题在这里已经有答案了 我想在不使用正则表达式的情况下将 rtf 字符串转换为纯文本 rtfstring rtf1 ansi ansicpg1252 deff0 deflang1033 fonttbl f0 Arial colortbl
  • 如何使用curl 通过代理模拟来自Firefox 的请求?

    特别是 当我将 Firefox 设置为使用 https 流量代理时 我尝试复制 Firefox 的行为 根据我的测试 Firefox 似乎向代理发送 CONNECT 请求 而以下curl 命令直接向代理发送 GET curl proxy b
  • 将列表框的选定值显示为标签 - 多个值

    我有一个名为 lstPTLNameDHOD 的列表框 其中有多个 PTL 名称 可以使用 Ctrl 键选择这些名称 我想在标签中显示选定的姓名 或者以某种方式显示提交表单的人可以看到他们提交表单的确切对象 我的问题是我只能在标签上显示一个名
  • Python:使用另一个大字典更新一个大字典

    我正在尝试使用另一个字典中的值来更新大型字典的某些值 其中它们具有相似的键 相同的日期但格式不同 我当前使用的流程太慢 我想减少瓶颈 这是我当前的解决方案 它将更新的字典写入文件 from dateutil import parser Fi
  • 在 Node.js 中共享对象并避免全局变量

    在下面的代码片段中共享数据库连接的最合适的方式是什么 db变量 与我的路由器 控制器 无需转动db变量变成全局变量 var mongo require mongoskin db mongo db config db adress app u
  • 使用 Akka 以编程方式获取临时端口

    如果我在 Akka 中将 ActorSystem 配置为使用临时 tcp 端口 更具体地说 我将 http 端口配置为 0 有没有办法在 ActorSystem 启动后以编程方式获取此端口 任何使用 actorOf 创建 Actor 的尝试
  • 如何找到 3 个数组的交集,同时忽略空数组?

    我必须找到 3 个整数数组的交集元素 有条件地说a b c 如果数组中的任何一个为 null 只需忽略该数组并找到剩余数组的交集 如果三个都为 null 则返回 提前致谢 ps 红宝石1 9 3 一种方法是这样的 a b c tap a a
  • Docker 编写安装requirements.txt

    在我的 docker 镜像中 我正在克隆 git master 分支来检索代码 我使用 docker compose 作为开发环境 并使用卷运行容器 我在从 python requests txt 文件安装新项目需求时遇到了问题 在开发环境
  • 如何在 IntelliJ 中调试 Clojure 文件?

    第5行不能设置断点 其中包含 x IntelliJ 不会让我这样做 我使用了不同的插件 例如拉克洛胡尔 https github com JetBrains la clojure and Cursive https cursivecloju
  • RMarkdown 可折叠面板

    当我正在为学生准备教程时 我需要一种方法来隐藏可折叠面板中的内容 这些内容可以通过单击按钮来显示 我已经使用下面的代码让它工作了 RMarkdown 文件如下所示 title Collapsible Panel output html do
  • 显示文本区域的当前行号和列号

    我正在我的网络应用程序中制作一个文件编辑界面 我有一个包含文件内容的文本区域 当文本区域聚焦时 我想输出光标的位置 即行号和列 这很有用 因为错误消息通常会产生行号 问题是 如何确定文本区域中光标的位置 我正在使用原型库 也许已经有解决方案
  • 使用 Gold Parser 解析项目和包文件 --“IdList”需要帮助

    我正在涉足对象帕斯卡引擎 http goldparser org engine 1 pascal index htm 作者 Rob van den Brink 并且看起来 除了一些小的且容易纠正的错误 它适用于 Delphi 单元文件 但是