跳过ANTLR中输入文件的部分
我想构建一个用于分析大型输入文件的解析器,但我不需要整个输入文件,只需要其中的一部分 对于exmaple,输入文件可能如下所示:跳过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
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