У вас нет правила синтаксического анализа (правила синтаксического анализа начинаются со строчной буквы), хотя я не уверен, что последняя часть необходима при интерпретации некоторых тестовых примеров в ANTLRWorks.
В любом случае, попробуйтечто-то вроде этого:
grammar AdifyMapReducePredicate;
parse
: (p=predicate {System.out.println("parsed :: "+$p.text);})+ EOF
;
predicate
: expression
;
expression
: booleanExpression
;
booleanExpression
: atom ((AND | OR) atom)*
;
atom
: ID
| '(' predicate ')'
;
AND
: '&&'
;
OR
: '||'
;
ID
: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
SPACE
: (' ' | '\t' | '\r' | '\n') {skip();}
;
со следующим тестовым классом:
import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
import org.antlr.stringtemplate.*;
public class Main {
public static void main(String[] args) throws Exception {
ANTLRStringStream in = new ANTLRStringStream("(A || B) (C && (D || F || G))");
AdifyMapReducePredicateLexer lexer = new AdifyMapReducePredicateLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
AdifyMapReducePredicateParser parser = new AdifyMapReducePredicateParser(tokens);
parser.parse();
}
}
, который после генерации лексера и парсера (a), компилирует все .java
файлы (b) и запускаеттестовый класс (c) производит следующий вывод:
parsed :: (A||B)
parsed :: (C&&(D||F||G))
a
java -cp antlr-3.2.jar org.antlr.Tool AdifyMapReducePredicate.g
b
javac -cp antlr-3.2.jar *.java
c (* nix / MacOS)
java -cp .:antlr-3.2.jar Main
c (Windows)
java -cp .;antlr-3.2.jar Main
HTH