2012-01-21 20 views
1

你如何用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类似的报头,但是这仅仅是在更复杂的文件的顶部)。

回答

3

它失败了,行1:0不匹配的输入'title:hello世界\ n'期待IDENT

您必须明白,词法分析器独立于解析器运行。不管是什么解析器会“喜欢”在一定的时间匹配,词法分析器遵循一些严格的规则,只是简单地创建令牌:

  1. 尝试在词法规则匹配从顶部令牌底部(第一个定义的规则都试过了第一);
  2. 尽可能匹配文本。如果2规则匹配相同数量的文本,则首先定义的规则将匹配。

由于规则2,您的REST_OF_LINE将始终从IDENT规则中“赢”。 IDENT令牌将被创建的唯一时间是末尾不再有\n。这就是你的语法出错的地方:错误消息指出它期望一个IDENT令牌,但找不到(但产生了一个REST_OF_LINE令牌)。

我知道ANTLR对解析类似MIME的头文件是过分的,但这只是在一个更复杂的文件的顶部。

您不能只定义要应用于文件头的标记(词法分析器规则)。这些令牌也适用于其他更复杂的文件。也许你应该预处理头文件与文件的其余部分分开?

-1

antlr解析通常分两步完成。 1.构建您的AST 2.定义你的语法

伪代码(已经几年,因为我有ANTLR饰演) - AST:

WORD : 'a'..'z'+ ; 
SEPARATOR : ':'; 
SPACE : ' '; 

伪码 - 树分析器:

header: WORD SEPARATOR WORD (SPACE WORD)+ 

希望有帮助....

+0

不幸的是我想把所有的文字都读到行尾,这可能包括数字,字母,标点符号。 –

+0

不,你没有从AST开始,你从一个语法开始。此外,生成一个AST甚至不是强制性的:你可以只使用分析树。 –

相关问题