Невозможно сказать, не видя как вы импортируете грамматику.
Имейте в виду, что:
- лексер грамматики могут импортировать только другие лексер грамматики;
- парсер грамматики могут импортировать только другие парсер грамматики;
- дерево грамматики могут импортировать только другие дерево грамматики;
- комбинированные грамматики могут импортировать лексер - и парсер грамматики (но не другие комбинированные грамматики!).
В вашем случае это будет выглядеть так:
BaseLexer.g
lexer grammar BaseLexer;
Num : '0'..'9'+;
Space : ' ' | '\t';
SpecificLexer.g
lexer grammar SpecificLexer;
import BaseLexer;
SpecificTokenA : 'specificA';
SpecificTokenB : 'specificB';
SpecificParser.g
parser grammar SpecificParser;
specific : SpecificTokenA | SpecificTokenB;
Combined.g
grammar Combined;
import SpecificLexer, SpecificParser;
parse
: Num Space specific EOF
{
System.out.println("Parsed:\n Num = " +
$Num.text + "\n specific = " + $specific.text);
}
;
и для проверки всего этого используйтеclass:
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.