0

私はantlr3とAntlrworksを使用しています。これが私の設定です:

レクサーベース//WS、数値などの基本的なトークンが含まれています。

レクサー固有//私の言語固有のトークンが含まれています-ANDはベースレクサーから派生しています

パーサー固有の//私の言語のパーサー

結合された文法->特定のレクサーと特定のパーサーをインポートします

生成すると、常にNPE(Java)を取得します。その理由は、生成された特定のレクサーのベースレクサーへの参照が初期化されていないためです。

私は何かが足りないのですか?

4

2 に答える 2

1

文法をどのようにインポートしているかを見ずに伝えることは不可能です。

次の点に注意してください。

  • レクサー文法は、他のレクサー文法のみをインポートできます。
  • パーサー文法は、他のパーサー文法のみをインポートできます。
  • ツリー文法は、他のツリー文法のみをインポートできます。
  • 複合文法は字句解析器および パーサー文法をインポートできます(ただし、他の複合文法はインポートできません!)。

あなたの場合、それは次のようになります。


BaseLexer.g

lexer grammar BaseLexer;

Num   : '0'..'9'+;
Space : ' ' | '\t';

特定のLexer.g

lexer grammar SpecificLexer;

import BaseLexer;

SpecificTokenA : 'specificA';
SpecificTokenB : 'specificB';

SpecificParser.g

parser grammar SpecificParser;

specific :  SpecificTokenA |  SpecificTokenB;

結合.g

grammar Combined;

import SpecificLexer, SpecificParser;

parse 
  :  Num Space specific EOF 
     {
       System.out.println("Parsed:\n  Num      = " + 
           $Num.text + "\n  specific = " + $specific.text);
     } 
  ;

すべてをテストするには、次のクラスを使用します。

import org.antlr.runtime.*;

public class Main {
  public static void main(String[] args) throws Exception {
    SpecificLexer lexer = new SpecificLexer(new ANTLRStringStream("42 specificB"));
    CombinedParser parser = new CombinedParser(new CommonTokenStream(lexer));
    parser.parse();
  }
}

レクサーとパーサーを生成し、Mainクラスを実行します。

java -cp antlr-3.3.jar org.antlr.Tool BaseLexer.g
java -cp antlr-3.3.jar org.antlr.Tool SpecificLexer.g
java -cp antlr-3.3.jar org.antlr.Tool SpecificParser.g
java -cp antlr-3.3.jar org.antlr.Tool Combined.g
javac -cp antlr-3.3.jar *.java
java -cp .:antlr-3.3.jar Main

これにより、次がコンソールに出力されます。

Parsed:
  Num      = 42
  specific = specificB

ANTLRWorks 1.4.3 でもテスト済みです。

于 2011-11-17T16:35:18.517 に答える
0

antlr 3.2 を使用して同じ問題に遭遇しました。OutOfMemory の問題に直面しているため、アップグレードは簡単ではありません。

パーサー文法で両方のレクサー文法を直接インポートするなど、別の解決策を試しましたが、成功しませんでした。最終的に、特定のレクサー文法ごとに基本レクサー文法をコピーする必要がありました。

于 2013-03-13T00:03:18.670 に答える