不明确的 ANTLR 解析器规则
Ambiguous ANTLR parser rule
我有一个非常简单的示例文本,我想用 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
所以,第一个例子被正确解析了。
但是,第二个示例不起作用,因为 eventNameRule 匹配下一个“#define ...”并且解析树不正确
感谢任何更改语法以正确解析此内容的帮助。
谢谢,
布西
正如 Adrian 所指出的,我在这里的主要错误是在初始规则 (prog) 中我使用了 "event" 而不是 "event+" 这将解决问题。
谢谢阿德里安。
除了缺少循环说明符之外,您的 WS 规则也有问题。第一个 alt 匹配任何内容。删除它。而且,顺便说一句,给你的 DIGIT 规则一个不同的名字。它匹配的不仅仅是数字。
我有一个非常简单的示例文本,我想用 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
所以,第一个例子被正确解析了。
但是,第二个示例不起作用,因为 eventNameRule 匹配下一个“#define ...”并且解析树不正确
感谢任何更改语法以正确解析此内容的帮助。
谢谢, 布西
正如 Adrian 所指出的,我在这里的主要错误是在初始规则 (prog) 中我使用了 "event" 而不是 "event+" 这将解决问题。
谢谢阿德里安。
除了缺少循环说明符之外,您的 WS 规则也有问题。第一个 alt 匹配任何内容。删除它。而且,顺便说一句,给你的 DIGIT 规则一个不同的名字。它匹配的不仅仅是数字。