У меня есть следующая грамматика для разбора логических формул первого порядка, применяемых к графикам:
grammar Graph;
/*------------------------------------------------------------------
* PARSER RULES
*------------------------------------------------------------------*/
input
:
formula EOF
;
formula
:
TRUE
| FALSE
| formula AND formula
| formula OR formula
| quantifier formula
| ST condition
;
condition
:
atom EQUALS QUOTE? (assignment | atom) QUOTE?
;
quantifier
:
(FOREACH | EXISTS) variable IN domain
;
domain
:
(GRAPH_A | GRAPH_B)
;
atom
:
variable DOT property
;
variable
:
(nodev | edgev)
;
nodev
:
(NODE | NODE1)
;
edgev
:
(EDGE | EDGE1)
;
property
:
(COLOR | VALUE)
;
assignment
:
(COLORTYPE | NUMBER)
;
/*------------------------------------------------------------------
* LEXER RULES
*------------------------------------------------------------------*/
TRUE : 'True' ;
FALSE : 'False' ;
AND : '&' ;
OR : '|' ;
ST : '->' ;
EXISTS : 'Exists' ;
FOREACH : 'Foreach' ;
NODE : 'node' ;
NODE1 : 'node1' ;
EDGE : 'edge' ;
EDGE1 : 'edge1' ;
IN : 'in' ;
GRAPH_A : 'GraphA' ;
GRAPH_B : 'GraphB' ;
EQUALS : '=' ;
DOT : '.' ;
COLOR : 'color' ;
VALUE : 'value' ;
NUMBER : ('0'..'9')+ (DOT ('0'..'9')+)? ;
QUOTE : '\'' ;
COLORTYPE : ('a'..'z')+ ;
WS : [ \t\r\n]+ -> skip ;
Я считаю, что это окончательная версия моей грамматики, поэтому теперь я хочу указать некоторую обработку ошибок для ввода. Проблема в том, что я не знаю как. Что я знаю, так это то, что после анализа ввода я могу выполнить итерацию по сгенерированному AST, и это место для добавления обработки ошибок.
Если синтаксический анализ не пройден, вернуть исключение синтаксического анализа; в противном случае я указал следующие случаи для возврата сообщения об ошибке.
Не может быть 1 квантификатора, за которым следует
-> condition
(это элемент формулы), где условие равноatom=atom
. Другими словами, если есть толькоquantifier
, тоcondition
должно быть равноatom EQUALS assignment
.Если есть 2 квантификатора, первый должен начинаться с
FOREACH
Переменные в квантификаторах должны использоваться в операторе
condition
.В левой части выражения не может быть более двух квантификаторов (поскольку в приложении, которое я разрабатываю, всего два графика). Таким образом, если количество квантификаторов больше, чем два, также возвращают ошибку.
Если есть 2 квантификатора, то к ним должны быть привязаны разные переменные.
Например, первый случай должен быть поднят, когда в качестве входных данных мы имеем
Exists node in GraphA -> node.color = node1.color
потому что node1
не указано в левой части выражения.
Примером для второго случая может быть следующий ввод
Exists node in GraphA Exists node1 in GraphB -> node.color = node1.color
Итак, мой вопрос: нужно ли мне реализовать всю проверку ошибок в сгенерированном дереве синтаксического анализа или я могу указать некоторые из них в грамматике, используя некоторый код Java. Если обработка ошибок должна происходить после анализа ввода, какие функции ANTLR 4 я могу использовать для реализации случаев ошибок? Любая помощь или совет будут высоко оценены!
enterFormula()
, этоCollection<ParseTree> q = XPath.findAll(ctx,"//quantifer",parser);
, гдеctx
имеет типFormulaContext
, и каждый раз я получаюNullPointerException
. У вас есть идеи, почему это происходит? 09.02.2014quantifier
, а неquantifer
. Вы должны создать задачу без GitHub, чтобы мы могли исправить это поведение (с лучшим сообщением об ошибке) для следующего выпуска: github.com/antlr/antlr4/issues 09.02.2014FormulaContext
, чтобы получить количество элементовQuantifier
? 09.02.2014