Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
跳过ANTLR中输入文件的部分_Antlr - Fatal编程技术网

跳过ANTLR中输入文件的部分

跳过ANTLR中输入文件的部分,antlr,Antlr,我想构建一个用于分析大型输入文件的解析器,但我不需要整个输入文件,只需要其中的一部分 对于exmaple,输入文件可能如下所示: bla bla bla bla bla ... EVENT: e1 type: t1 version: 1 additional-info: abc EVENT: e2 type: t2 version: 1 uninteresting-info: def blu blu blu blu blu ... 从这个文件中,我只想得到一个事件到类型的映射(e1=>t

我想构建一个用于分析大型输入文件的解析器,但我不需要整个输入文件,只需要其中的一部分

对于exmaple,输入文件可能如下所示:

bla bla bla bla bla ...

EVENT: e1
type: t1
version: 1
additional-info: abc

EVENT: e2
type: t2
version: 1
uninteresting-info: def

blu blu blu blu blu ...
从这个文件中,我只想得到一个事件到类型的映射(e1=>t1,e2=>t2)。我对所有其他信息都不感兴趣


如何构建一个简单的ANTLR语法来实现这一点?

您可以通过在lexer中引入一个布尔标志来实现这一点,该标志跟踪是否遇到了
事件或
类型
-关键字。如果遇到这种情况,词法分析器不应跳过该单词,而应跳过所有其他单词

一个小演示:

语法T;
@lexer::成员{
私有布尔ignoreWord=true;
}
作语法分析
:事件*EOF
;
事件
:事件w1=单词类型w2=单词
{System.out.println(“event=“+$w1.text+”,type=“+$w2.text);}
;  
事件
:'事件:'{ignoreWord=false;}
;
类型
:'类型:'{ignoreWord=false;}
;
单词
:('a'..'z'|'a'..'z'|'0'..'9')+{if(ignoreWord)skip();}
;
新线
:('\r'?'\n'|'\r'){ignoreWord=true;skip();}
;
其他
:  . {skip();}
;
您可以使用以下类测试解析器:

import org.antlr.runtime.*;
公共班机{
公共静态void main(字符串[]args)引发异常{
字符串src=
“等等等等…\n”+
“\n”+
“阻止:…\n”+
“事件:…\n”+
“\n”+
“事件:e1\n”+
“类型:t1\n”+
“版本:1\n”+
“其他信息:abc\n”+
“\n”+
“事件:e2\n”+
“类型:t2\n”+
“版本:1\n”+
“无趣信息:def\n”+
“\n”+
“blu-blu-blu-blu…\n”;
TLexer lexer=new-TLexer(new-ANTLRStringStream(src));
TParser parser=newtparser(newcommontokenstream(lexer));
parser.parse();
}
}
将产生以下输出:

java-cp antlr-3.3.jar org.antlr.Tool T.g
javac-cp antlr-3.3.jar*.java
java-cp.:antlr-3.3.jar Main
事件=e1,类型=t1
事件=e2,类型=t2