2

私は、Language Implementation Patterns book の Cymbol 文法に大きく基づいた独自の言語アプリケーションに取り組んでいます。私は ANTLRworks を使用して文法を開発し、Eclipse を使用して完全なアプリケーションを Java で実装しています。私の文法の一部として、次の 2 つの規則があります。

varDeclaration
  :  'var' ID 'is' dataType (':=' expr )? ';'
     -> ^('var' ^(NAME ID) ^(VARTYPE dataType) ^(VALUE expr)?)
  ;
constantDeclaration
  :  'const' ID 'is' dataType ':=' expr ';'
     -> ^('const' ^(NAME ID) ^(VARTYPE dataType) ^(VALUE expr))
  ;

パーサーを実行し、生成された AST を出力した後、これらの両方の出力は正しいように見えます。

次に、シンボル定義ツリー マッチャーを (filter-true を使用して) 実行して、シンボル テーブルを作成します。各機能/ブロック/などの入力とは別に。新しいスコープを開始するために、以下のようにトップダウン ルールで変数と定数の定義も処理します (これも言語実装パターンの本に基づいています)。

topdown
  :  varDeclaration
  |  constDeclaration
  | ...
  ;

varDeclaration
  :  ^('var' ^(NAME ID) .*) //^(VAR ^(NAME ID) .*) Rewrote this for clarity of example
     {
        System.out.println("In a variable declaration");
     }
  ;

constDeclaration
  :  ^('const' ^(NAME ID) .*)
     {
        System.out.println("Const definition");
     }
  ;

私の問題は、constDeclaration のみが一致することです。入力に ​​varDeclaration がありますが (AST 出力で確認)、「Const definition」が表示されるのに対して、「In a variable definition」がコンソールに表示されることはありません。

これをデバッグ/解決するために多くのことを試しました:

  • キーワードを除いて const 宣言と文法的に同じになるように、変数宣言のオプションの初期化式をオプションではないものにしました。
  • キーワード 'var' を別のもの (この場合は 'splunge') に変更しました。
  • 特定のワイルドカードを使用するように一致パラメーターを変更しました (例: ^(VAR vn=. vt=. vv=.))
  • varDeclaration をボトムアップ ルールに入れてみました。

ご覧のとおり、一方のルールとパターンが一致し、もう一方が一致しない理由がわからないため、私はかなり必死になっていました。変数宣言と定数宣言のその他の唯一の違いは、定数宣言はコード ブロック内およびトップ レベル (グローバルな const の場合) で行うことができるのに対し、変数はコード ブロック内でのみ宣言できることです。var が一致しないのに、コード ブロック内の const が一致する理由にこれがどのように影響するかはわかりません。

このコードは、正しく一致しない例です。

function foo(int a) returns (int) {
  const PI is real := 3.14159;  // Recognized
  var r is real;                // Not recognized
  var s is int := 4;            // Not recognized
  const TESTCONST is int := 3;  // Recognized
  // Other code (if statements, for loops) recognized.
}

私はこの問題を数日間解決しようとしてきましたが、頭がいっぱいです。私は何が欠けていますか?

追加情報 (2013 年 3 月 20 日追加)

さらに明確にするために、次のような宣言を入力します。

const y is real := 2.4;  // Recognized
var temp is int := 0 ;   // Not recognized

AST で以下を生成します。

(const (NAME y) (VARTYPE (SCALAR (NAME (TYPEID real)))) (VALUE (EXPR 2.4)))
(var (NAME temp) (VARTYPE (SCALAR (NAME (TYPEID int)))) (VALUE (EXPR 0)))

const AST は上記のツリー文法に一致しますが、var AST は一致しません。

4

1 に答える 1

2

パーサーではリテラル'var'に一致しますが、ツリー パーサーでは を探してい^(VAR ...ます。レクサーには次のルールが正確に含まれていますか?

VAR : 'var';

ツリー パーサー (動作すると言う) では、constDeclarationパーサーで使用したのと同じリテラル構文を使用しています。^('const' ...

于 2013-03-19T15:35:54.010 に答える