你如何使用ANTLR做这样的事情?
示例输入:
title: hello world
语法:
header : IDENT ':' REST_OF_LINE ;
IDENT : 'a'..'z'+ ;
REST_OF_LINE : ~'\n'* '\n' ;
失败,line 1:0 mismatched input 'title: hello world\n' expecting IDENT
(我知道ANTLR对于解析类似MIME的标题来说太过分了,但这只是一个更复杂的文件的顶部。)
答案 0 :(得分:3)
失败,第1行:0输入不匹配'标题:hello world \ n'期待IDENT
您必须了解词法分析器独立于解析器运行。无论解析器在某个时间“喜欢”匹配什么,词法分析器只是按照一些严格的规则创建令牌:
由于规则2,您的REST_OF_LINE
将永远“赢得”IDENT
规则。创建IDENT
令牌的唯一时间是最后不再有\n
。这就是你的语法出了问题:错误消息表明它需要一个IDENT
令牌,但是找不到(但会产生REST_OF_LINE
令牌)。
我知道ANTLR对于解析类似MIME的标题是过分的,但这只是一个更复杂的文件的顶部。
您不能只定义要应用于文件头的令牌(词法规则)。这些标记也将应用于更复杂文件的其余部分。也许您应该将文件头与文件的其余部分分开预处理?
答案 1 :(得分:-1)
antlr解析通常分两步完成。 建构你的 2.定义你的语法
伪代码(自从我和antlr一起玩了几年) - AST:
WORD : 'a'..'z'+ ;
SEPARATOR : ':';
SPACE : ' ';
伪代码 - 树解析器:
header: WORD SEPARATOR WORD (SPACE WORD)+
希望有所帮助....