gpt4 book ai didi

delphi - 使用 Gold Parser 解析项目和包文件 - 需要 'IdList' 的帮助

转载 作者:行者123 更新时间:2023-12-03 15:56:09 25 4
gpt4 key购买 nike

我正在涉足 Object Pascal Engine (作者:Rob van den Brink)并且看起来(除了一些小的且容易纠正的错误)它适用于 Delphi 单元文件。

但是,它在解析项目 (.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 语法:

改变

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

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

并添加

<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 行/状态上的无效起始符号和词法错误。也许我'错过了一些东西......

关于delphi - 使用 Gold Parser 解析项目和包文件 - 需要 'IdList' 的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35871440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com