2012-05-23 25 views
1

我需要解析由第三方应用程序生成的文件。使用ANTLR,我构建了一个似乎工作正常的解析器,直到我遇到以下障碍。分析此文件格式时扫描仪输出的困难

文件类型是基于行的,并使用几个关键字来定义分层结构;所谓的“块”,它们本身可以有子块,等等。根据当前块的类型,各种线具有特殊的含义,例如,在一个特定的块中,第5行(相对于块的开始)保存文件的作者,在另一行中,第3行是文件名等。所有这些基本上都是字符串,即用户可以输入他们想要的任何东西用于创建文件时的数据;但它们是字符串的事实只能通过行号隐含知道。

因为没有引号或任何东西来标识这些字符串,我的词法分析器偶尔会标记这些文本的一部分(如数字或与关键字相同的单词),结果是我无法可靠地重建解析器规则中标记的原始字符串。

是否有可能用像我想要的解析器生成器来处理这种文件?由于我对解析器的构造不是非常熟悉,所以我希望ANTLR有一个简单的解决方法或特性来帮助解决这个小问题。

+1

不要使用ANTLR来分析这样的语法。无言的aproach(如packrat)会更好。事实上,无词法分析几乎总是更好。 –

+0

由于@ SK-逻辑已经提到:无扫描器的解析器在这里是更好的选择。然而,如果你热衷于使用ANTLR(无论出于何种原因),你应该编辑你的问题,并发布你的语法和一些示例输入,并指出事情出错的地方(以及如何)。 *有*变通办法使ANTLR像无扫描程序分析器一样工作。但是,如果您可以自由选择更改解析器生成器,则可能需要使用PEG或Packrat(请参阅http://en.wikipedia.org/wiki/Comparison_of_parser_generators)。 –

+0

我绝对不会遇到ANTLR,所以我会按照您的建议并使用无扫描程序的方法。我认为在这种情况下,标记化会阻碍解析过程。 – waldrumpus

回答

1

不要使用ANTLR或Yacc或任何其他类似的工具来分析这样的语法(没有明确的和上下文无关的一组预定义的标记)。

无词法的方法(如Packrat或任何其他解释PEGs的方法)会更好。

有很多Packrat实现四周,它不是很难在任何语言编写一个特设递归下降PEG解析器,没有任何第三方工具,尤其是对于没有具体的性能要求一个简单的语法。