基本上我想找到,在一个文件中,使用ANTLR,每个表达式定义:
词。词
例如:"end. "开始"匹配
目前文件可能有成百上千行,结构复杂。
是否有一种方法可以跳过与上面描述的模式不匹配的所有内容(字符?),而不创建完全表示文件的语法?
到目前为止,这是我的语法,但我不知道下一步该怎么做。
grammar Dep;
program
:
dependencies
;
dependencies
:
(
dependency
)*
;
dependency
:
identifier
DOT
identifier
;
identifier
:
INDENTIFIER
;
DOT : '.' ;
INDENTIFIER
:
[a-zA-Z_] [a-zA-Z0-9_]*
;
OTHER
:
. -> skip
;
您现在这样做的方式,dependency
规则也将匹配来自输入的令牌'end'
, '.'
, 'beginning'
:
end
#####
.
#####
beginning
,因为从令牌流中跳过了换行符和'#'
s。
如果不是你想要的,即你想匹配"end.beginning"
之间没有任何字符,你应该做一个单一的词法分析器规则,并在你的解析器中匹配该规则:
grammar Dep;
program
: DEPENDENCY* EOF
;
DEPENDENCY
: [a-zA-Z_] [a-zA-Z0-9_]* '.' [a-zA-Z_] [a-zA-Z0-9_]*
;
OTHER
: . -> skip
;
那么您可以使用树侦听器对DEPENDENCY
's做一些有用的事情:
public class Main {
public static void main(String[] args) throws Exception {
String input = "### end.beginning ### end ### foo.bar mu foo.x";
DepLexer lexer = new DepLexer(new ANTLRInputStream(input));
DepParser parser = new DepParser(new CommonTokenStream(lexer));
ParseTreeWalker.DEFAULT.walk(new DepBaseListener(){
@Override
public void enterProgram(@NotNull DepParser.ProgramContext ctx) {
for (TerminalNode node : ctx.DEPENDENCY()) {
System.out.println("node=" + node.getText());
}
}
}, parser.program());
}
}
将打印:
<>之前节点= end.beginning节点= foo.bar节点= foo.x