如何在ANTLR中使用文本直到换行?

时间:2012-01-21 00:26:43

标签: antlr

你如何使用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的标题来说太过分了,但这只是一个更复杂的文件的顶部。)

2 个答案:

答案 0 :(得分:3)

  

失败,第1行:0输入不匹配'标题:hello world \ n'期待IDENT

您必须了解词法分析器独立于解析器运行。无论解析器在某个时间“喜欢”匹配什么,词法分析器只是按照一些严格的规则创建令牌:

  1. 尝试在词法分析器规则中从上到下匹配标记(首先尝试定义的规则);
  2. 尽可能多地匹配文本。如果2个规则匹配相同数量的文本,则首先定义的规则将匹配。
  3. 由于规则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)+

希望有所帮助....