Parsing 解析此文件格式时扫描仪输出有困难

Parsing 解析此文件格式时扫描仪输出有困难,parsing,antlr,Parsing,Antlr,我需要解析由第三方应用程序生成的文件。使用ANTLR,我构建了一个似乎工作正常的解析器,直到遇到以下障碍 文件类型基于行,使用多个关键字定义层次结构;所谓的“块”,它们本身可以有子块,等等。根据当前块的类型,不同的行具有特殊的含义,例如,在一个特定块中,第5行(相对于块的开始)包含文件的作者,在另一个块中,第3行是文件名,等等。所有这些基本上都是字符串,即用户可以在创建文件时输入他们想要的任何数据;但它们是字符串的事实只能通过行号隐式地知道 因为没有引号或任何东西来识别这些字符串,我的lexer

我需要解析由第三方应用程序生成的文件。使用ANTLR,我构建了一个似乎工作正常的解析器,直到遇到以下障碍

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

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


有没有可能像我尝试的那样用解析器生成器处理这种文件?由于我不太精通语法分析器的构造,我希望有一个简单的解决方法或ANTLR的功能可以帮助克服这个小问题。

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

一个无词汇的方法(比如,或者任何其他的解释方法)会更好


有很多Packrat实现,在没有任何第三方工具的情况下,用任何语言编写一个特别的递归下降PEG解析器并不困难,特别是对于没有特定性能要求的普通语法。

不要使用ANTLR或Yacc或任何其他类似工具来解析这样的语法(没有独立于上下文的预定义标记集)

一个无词汇的方法(比如,或者任何其他的解释方法)会更好


有很多Packrat实现,在没有任何第三方工具的情况下,用任何语言编写一个特别的递归下降PEG解析器并不困难,特别是对于没有特定性能要求的普通语法。

不要使用ANTLR来解析这样的语法。无词法的aproach(如Packrat)会更好。事实上,无词法解析几乎总是更好。正如@SK logic已经提到的:无扫描程序的解析器在这里是一个更好的选择。但是,如果您热衷于使用ANTLR(无论出于何种原因),您应该编辑您的问题,发布您的语法和一些示例输入,并指出在哪里(以及如何)出了问题。有一些变通方法可以使ANTLR的行为类似于无扫描程序的解析器。但是,如果您可以自由选择更改解析器生成器,您可能需要使用PEG或Packrat(请参阅:)。我决不受ANTLR的约束,因此我将遵循您的建议,使用无扫描仪的方法。在这种情况下,标记化会阻碍解析过程,这对我来说是有意义的。如果您中的一位愿意将其评论转化为答案,我将欣然接受。不要使用ANTLR解析此类语法。一种无词汇的语法(如packrat)会更好。事实上,无词法解析几乎总是更好。正如@SK logic已经提到的:无扫描程序的解析器在这里是一个更好的选择。但是,如果您热衷于使用ANTLR(无论出于何种原因),您应该编辑您的问题,发布您的语法和一些示例输入,并指出在哪里(以及如何)出了问题。有一些变通方法可以使ANTLR的行为类似于无扫描程序的解析器。但是,如果您可以自由选择更改解析器生成器,您可能需要使用PEG或Packrat(请参阅:)。我不一定要使用ANTLR,因此我将遵循您的建议,使用无扫描仪的方法。在这种情况下,标记化会阻碍解析过程,这对我来说是有意义的。如果您中的一位愿意将其评论转化为答案,我将很乐意接受。