我有以下语法来解析应用于图形的一阶逻辑公式:
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(这是一个公式元素),其中condition等于atom = atom.换句话说,如果只有量词,那么条件应该等于原子EQUALS赋值.
>如果有2个量词,则第一个应该从FOREACH开始
>应在条件语句中使用量词中的变量
>在表达式的左侧不能有两个以上的量词(因为在我开发的应用程序中,只有两个图形).因此,如果量词的数量大于那么两个返回错误
>如果有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的哪些功能来实现错误情况?任何帮助或建议将不胜感激!