是否可以仅使用antlr4解析文件的前半部分? 我正在解析大型文件,并且正在使用UnbufferedCharStream和UnbufferedTokenStream。
我没有建立解析树,而是使用解析动作而不是访问者/收听者模式。有了这些,我能够节省大量的RAM并提高解析速度。
但是,解析整个文件仍需要15秒左右的时间。解析后的文件分为两部分。文件的前半部分具有元数据,后半部分是实际数据。大部分时间都用在数据部分,因为超过3m。要解析的行。元数据部分只有大约20,000行。是否可以仅解析前半部分,这将大大提高解析速度?是否可以在元数据部分之后手动注入EOF?
将文件一分为二如何?
答案 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();
}