不明确的ANTLR解析器规则

问题描述:

我有一个非常简单的示例文本,我想用ANTLR解析,但由于规则的含糊不清而导致错误的结果。不明确的ANTLR解析器规则

下面是语法:

grammar SimpleExampleGrammar; 

prog : event EOF; 

event : DEFINE EVT_HEADER eventName=eventNameRule; 

eventNameRule : DIGIT+; 

DEFINE : '#define'; 

EVT_HEADER : 'EVT_'; 

DIGIT     :   [0-9a-zA-Z_]; 

WS  : ('' | ' ' | '\r' | '\n' | '\t') -> channel(HIDDEN); 

第一个文本例如:

#define EVT_EX1 

第二个文本例如:

#define EVT_EX1 
#define EVT_EX2 

所以,第一个例子是正确分析。

enter image description here

然而,第二个例子是不行的,因为eventNameRule接下来的比赛 “的#define ...” 并解析树是不正确

enter image description here

感谢所有帮助改变语法来正确地解析它。

感谢, 布西

+0

您是如何生成图表的?第二个例子根据你的语法无效,因为'prog'只是一个'event'。 – 2015-03-31 14:50:06

+0

嗨艾德里安,感谢您的评论。 我使用AntlWorks2来生成图形。 http://tunnelvisionlabs.com/products/demo/antlrworks – baruchl 2015-03-31 17:01:55

除了缺少循环说明符之外,您的WS规则中也有问题。第一个ALT匹配任何东西。删除。顺便说一句,给你的数字规则一个不同的名字。它不仅仅是数字。

+0

你当然是对的,谢谢! – baruchl 2015-04-01 08:31:30

阿德里安指出的那样,我在这里主要错误是,在初始规则(前卫),我用“事件”,而不是“事件+”,这将解决这一问题。

谢谢阿德里安。

+0

尽管如此,即使丢失循环,它也不应该与第二个#define匹配,因为哈希符号不是数字规则的一部分。也许树打印输出是越野车? – 2015-04-01 07:08:03

+0

谢谢迈克。请注意,他与“#define”不匹配,红色部分表示意外输入。 – baruchl 2015-04-01 08:30:56

+0

啊,这当然是有道理的。 – 2015-04-01 09:52:14