3

私はObject Pascal エンジン(Rob van den Brink 作) に手を出していますが、Delphi ユニット ファイルで動作するようです (いくつかのマイナーで簡単に修正可能なエラーを除く)。

ただし、プロジェクト ( .dpr) およびパッケージ ( .dpk) ファイルの解析に問題があります。そして、この問題は基本的に、「uses」がユニットとプロジェクトで持つことができるもの(および「contains」句がパッケージで持つことができるもの)の違いに要約されます。

簡単な例を挙げましょう:

ユニット (.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';
4

1 に答える 1

2

私自身はまだ 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's Builder は開き中括弧文字と閉じ中括弧文字 { } を特別なケースとして扱い、コメントを囲む以外の目的で使用できないように思われます。文法規則の一部としてそれらを使用する方法を見つけることができませんでした. この変更の結果、'{Form1}' がコメントとして単純に無視され、例の構成が代わりに以前のバリアント ("<RefID> IN StringLiteral") と一致するようになるはずです。

Fwiw、Gold は、次のようないくつかの問題を除けば、非常に優れたパッケージに見えます。

  • 文字 0..127 のみを処理できるという ReadMe に記載されている制限と

  • そのパーサー ビルダー (v.5.2) は、(提案された変更の前に) 付属の D7 サンプル文法を使用して実行すると、無効な開始記号と行/状態 82 の字句エラーについて不平を言います。

于 2016-03-08T17:40:00.297 に答える