1

是否可以只用 antlr4 解析文件的前半部分?我正在解析大文件,并且正在使用 UnbufferedCharStream 和 UnbufferedTokenStream。

我没有构建解析树,而是使用解析操作而不是访问者/侦听器模式。有了这些,我能够节省大量的 RAM 并提高解析速度。

然而,解析整个文件仍然需要大约 15 秒。解析后的文件分为两部分。文件的前半部分有元数据,后半部分是实际数据。大部分时间都花在数据部分,因为有超过 3m。要解析的行。元数据部分只有大约 20,000 行。是否可以只解析前半部分,这会显着提高解析速度?是否可以在元数据部分之后手动注入 EOF?

把文件分成两份怎么样?

4

3 回答 3

0

您如何以编程方式仅提取要解析的部分并创建一个新的 tmp.extension 文件以进行解析?它可能看起来像这样:

System.IO.File.WriteAllText(@"C:\Users\Path\tmp.extension", text);

解析后,您可以删除 tmp 文件,原始文件保持原样。

System.IO.File.Delete(@"C:\Users\Path\tmp.extension");
于 2018-07-12T09:51:07.123 回答
0

所以,我能够找到解决方案。我从生成的词法分析器中覆盖了 Emit 方法,因此它找到了第二部分的开头并手动注入 EOF 令牌,如下所示:

public override IToken Emit()
{
    string tokenText = base.Text;
    if (this.metaDataOnly && tokenText == "DATA")
        return base.EmitEOF();
    return base.Emit();
}
于 2018-07-13T09:36:45.460 回答
0

ANTLR4 创建递归体面的解析器,解析函数可以直接调用。假设你有这样的语法:

grammar t;

start: meta data EOF;
meta: x y z;

data: a b c+;

您的自然入口点将是start规则(在您的情况下,这将是整个文件的规则)。但也可以只调用 rule meta,在您的情况下它可能是文件的标题部分。如果你不以 EOF 结束这条规则,你的解析器将只消耗足够的输入来解析整个文件的这个特定部分。

于 2018-07-13T06:20:08.770 回答