Моя простая грамматика ANTLR не работает, как ожидалось
Я новичок в ANTLR и после прочтения руководства и различных форумов пытаюсь написать простую грамматику ANTLR, которая допускает такие выражения, как "(A и B)" или "(C и D)" или "((A и B) или (А и С)) "и ничего более. (Никаких специальных символов, кроме паренов, никаких операторов, кроме AND и OR, все переменные должны быть одной буквой между "A" и "Z".)
Тем не менее, моя простая грамматика (ниже) позволяет: а) специальные символы (они игнорируются, когда они должны вызывать ошибки); б) переменные, длина которых превышает один символ (при условии, что они начинаются с A по Z - в этом случае они обрабатываются в качестве единственной символьной переменной в результирующем дереве) в) числовые значения (например, 123) .. они просто игнорируются, кстати.
Итак, почему моя простая грамматика не работает?
grammar QvidianPlaybooks;
options{ language=CSharp2; output=AST; ASTLabelType = CommonTree; }
@lexer::members {
public List<System.String> errors = new List<System.String>();
}
public parse
: expression
;
LPAREN : '(' ;
RPAREN : ')' ;
ANDOR : 'AND'|'and'|'OR'|'or';
NAME : ('A'|'B'|'C'|'D'|'E'|'F'|'G'|'H'|'I'|'J'|'K'|'L'|'M'|'N'|'O'|'P'|'Q'|'R'|'S'|'T'|'U'|'V'|'W'|'X'|'Y'|'Z');
WS : ' ' { $channel = Hidden; };
// ***************** parser rules:
expression : anexpression EOF!;
anexpression : atom (ANDOR^ atom)*;
atom : NAME | LPAREN! anexpression RPAREN!;
Спасибо за помощь.