我正在涉足对象帕斯卡引擎 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';