Мне необходимо написать логический синтаксический анализатор/оценщик. выражение будет иметь вид и будет заключено в круглых скобках:Antlr - синтаксический анализатор выражений и оценщик
exp1 : (A = B)
exp2 : ((A = B) AND (C = D))
exp3 : ((A = B) AND ((C = D) OR (E = F)))
exp4: (((A = B) AND (C = D)) OR (E = F))
и это продолжается. Правило может содержать «n» количество выражений с соответствующей группировкой 2 в каждой группе. Мой файл грамматики выглядит следующим образом:
/*
Expression grammar
*/
grammar Exparser;
options
{
language = Java;
}
cond :
tc EOF;
tc:
exp
| binary_exp
| leftparen* exp (binaryop leftparen* exp rightparen+)*
| leftparen* exp (binaryop leftparen* exp rightparen*)*
;
binary_exp:
'(' exp BINARYOP exp ')'
;
binaryop:
BINARYOP
;
leftparen:
LEFTPARN
;
rightparen:
RIGHTPARN
;
exp:
LEFTPARN VARIABLE COMPOP VARIABLE RIGHTPARN
;
variable:
VARIABLE;
BINARYOP: AND | OR;
COMPOP: EQUAL | LT | GT | LTE | GTE | NE;
VARIABLE: (CHAR)+;
LEFTPARN: '(';
RIGHTPARN: ')';
EQUAL: '=' | 'EQ';
LT: '<' | 'LT';
GT:'>' | 'GT';
LTE: '<=';
GTE: '>=';
NE : '!=' | 'NE';
AND: 'AND' | '&' | 'and';
OR: 'OR' | 'or';
CHAR : 'a'..'z'|'A'..'Z'|'_' |'0'..'9'|'-' | '.'
;
эта грамматика работает отлично, но я не в состоянии достичь глубины в AST. например, exp3 анализируется как три exp
, а не один exp
и один binary_exp
. Также как я могу вычислять логическое выражение, используя мой парсер? Как моя грамматика обеспечивает балансировку круглых скобок? Хотя Nested Boolean Expression Parser using ANTLR дать некоторую идею для оценки выражения, я не могу применить в своем случае
Спасибо, Барт. Я мог бы получить свою структуру дерева, когда я запускал это на antlrworks 2. Мне еще предстоит работать над частью оценки. – ssdimmanuel
Грамматика работала как шарм. Я сделал простые изменения в соответствии с моими потребностями. Для меня выражения в моих приложениях довольно статичны после определения. Я думал написать дерево разбора на диск, но обнаружил, что это невозможно, поскольку классы не являются Serializable. Есть ли другой проверенный метод для этого? – ssdimmanuel
Я еще не изучал сериализацию/сохранение классов ANTLR 4. –