java4错误_java – 如何在ANTLR4中实现错误处理

我有以下语法来解析应用于图形的一阶逻辑公式:

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的哪些功能来实现错误情况?任何帮助或建议将不胜感激!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值