我需要翻译的内容是:我有以下语法来解析应用于图形上的一阶逻辑公式:
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,并在此处添加错误处理。
如果解析失败,则返回解析异常;否则,我已经指定了以下返回错误消息的情况。
- 不能有一个量词后跟
->条件
(这是一个公式元素),其中条件等于原子=原子
。换句话说,如果只有量词
,那么条件
应该等于原子EQUALS赋值
。 - 如果有2个量词,则第一个应以
FOREACH
开始。 - 量词中的变量应在
条件
语句中使用 - 表达式左侧不能有超过两个量词(因为在我正在开发的应用程序中只有两个图)。因此,如果量词数大于2,则也会返回错误
- 如果有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的哪些功能来实现错误情况?任何帮助或建议都将不胜感激!
visitor
类能够解决我的问题。当我遍历解析树时,我会将我感兴趣的元素添加到数据结构中(可能是HashMap
或其他东西),然后应用所需的逻辑。我是否朝着正确的方向前进,还是缺少ANTLR的一些基本知识? - Wosh