文法をどのようにインポートしているかを見ずに伝えることは不可能です。
次の点に注意してください。
- レクサー文法は、他のレクサー文法のみをインポートできます。
- パーサー文法は、他のパーサー文法のみをインポートできます。
- ツリー文法は、他のツリー文法のみをインポートできます。
- 複合文法は字句解析器および パーサー文法をインポートできます(ただし、他の複合文法はインポートできません!)。
あなたの場合、それは次のようになります。
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 でもテスト済みです。