基本上我想在文件中使用ANTLR找到每个定义的表达式:
WORD.WORD
例如:“end.beginning”匹配
目前该文件可能有数百行和一个复杂的结构。
有没有办法跳过与上述模式不匹配的所有事物(字符?),而没有制作完全代表文件的语法?
到目前为止,这是我的语法,但我不知道下一步该做什么。
grammar Dep;
program
:
dependencies
;
dependencies
:
(
dependency
)*
;
dependency
:
identifier
DOT
identifier
;
identifier
:
INDENTIFIER
;
DOT : '.' ;
INDENTIFIER
:
[a-zA-Z_] [a-zA-Z0-9_]*
;
OTHER
:
. -> skip
;
答案 0 :(得分:1)
您现在的做法是,dependency
规则还会匹配来自输入的令牌'end'
,'.'
,'beginning'
:
end
#####
.
#####
beginning
因为正在从令牌流中跳过换行符和'#'
。
如果不你想要什么,即你想匹配"end.beginning"
之间没有任何字符,你应该制定一个词法分析器规则,并匹配该规则在您的解析器中:
grammar Dep;
program
: DEPENDENCY* EOF
;
DEPENDENCY
: [a-zA-Z_] [a-zA-Z0-9_]* '.' [a-zA-Z_] [a-zA-Z0-9_]*
;
OTHER
: . -> skip
;
然后你可以使用tree listener对你的DEPENDENCY
做一些有用的事情:
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());
}
}
会打印:
node=end.beginning node=foo.bar node=foo.x