Antlr4:如何仅解析文件的一部分

时间:2018-07-12 09:03:05

标签: c# parsing antlr4

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

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

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

将文件一分为二如何?

3 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

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

grammar t;

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

data: a b c+;

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

答案 2 :(得分:0)

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

public override IToken Emit()
{
    string tokenText = base.Text;
    if (this.metaDataOnly && tokenText == "DATA")
        return base.EmitEOF();
    return base.Emit();
}