gpt4 book ai didi

antlr - 在 ANTLR 中跳过部分输入文件

转载 作者:行者123 更新时间:2023-12-03 20:20:33 25 4
gpt4 key购买 nike

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

例如,输入文件可能如下所示:

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 语法来执行此操作?

最佳答案

您可以通过在词法分析器中引入一个 bool 标志来做到这一点,该标志会跟踪是否遇到了 event- 或 type- 关键字。如果遇到了,词法分析器应该跳过这个词,所有其他词应该被跳过。

一个小演示:

grammar T;

@lexer::members {
private boolean ignoreWord = true;
}

parse
: event* EOF
;

event
: Event w1=Word Type w2=Word
{System.out.println("event=" + $w1.text + ", type=" + $w2.text);}
;

Event
: 'EVENT:' {ignoreWord=false;}
;

Type
: 'type:' {ignoreWord=false;}
;

Word
: ('a'..'z' | 'A'..'Z' | '0'..'9')+ {if(ignoreWord) skip();}
;

NewLine
: ('\r'? '\n' | '\r') {ignoreWord=true; skip();}
;

Other
: . {skip();}
;

您可以使用以下类测试解析器:

import org.antlr.runtime.*;

public class Main {
public static void main(String[] args) throws Exception {
String src =
"bla bla bla bla bla ... \n" +
" \n" +
"prEVENT: ... \n" +
"EVENTs: ... \n" +
" \n" +
"EVENT: e1 \n" +
"type: t1 \n" +
"version: 1 \n" +
"additional-info: abc \n" +
" \n" +
"EVENT: e2 \n" +
"type: t2 \n" +
"version: 1 \n" +
"uninteresting-info: def \n" +
" \n" +
"blu blu blu blu blu ... \n";
TLexer lexer = new TLexer(new ANTLRStringStream(src));
TParser parser = new TParser(new CommonTokenStream(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

event=e1, type=t1
event=e2, type=t2

关于antlr - 在 ANTLR 中跳过部分输入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8313722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com