ANTLR4特定搜索
基本上,我想在文件中使用ANTLR查找定义的每个表达式: 一字不差 例如:“结束。开始”匹配 目前,该文件可以有成百上千行和复杂的结构 是否有一种方法可以跳过与上述模式不匹配的所有内容(字符?),而不生成完全表示文件的语法 到目前为止,这是我的语法,但我不知道下一步该怎么办ANTLR4特定搜索,antlr4,Antlr4,基本上,我想在文件中使用ANTLR查找定义的每个表达式: 一字不差 例如:“结束。开始”匹配 目前,该文件可以有成百上千行和复杂的结构 是否有一种方法可以跳过与上述模式不匹配的所有内容(字符?),而不生成完全表示文件的语法 到目前为止,这是我的语法,但我不知道下一步该怎么办 grammar Dep; program : dependencies ; dependencies : ( dependency )*
grammar Dep;
program
:
dependencies
;
dependencies
:
(
dependency
)*
;
dependency
:
identifier
DOT
identifier
;
identifier
:
INDENTIFIER
;
DOT : '.' ;
INDENTIFIER
:
[a-zA-Z_] [a-zA-Z0-9_]*
;
OTHER
:
. -> skip
;
按照您现在的操作方式,
依赖关系
规则还将匹配输入中的标记'end'
,。
,'start'
:
end
#####
.
#####
beginning
因为正在从令牌流中跳过换行符和“#”
s
如果这不是您想要的,即您想要匹配“end.start”
,而中间没有任何字符,那么您应该为它创建一个lexer规则,并在解析器中匹配该规则:
grammar Dep;
program
: DEPENDENCY* EOF
;
DEPENDENCY
: [a-zA-Z_] [a-zA-Z0-9_]* '.' [a-zA-Z_] [a-zA-Z0-9_]*
;
OTHER
: . -> skip
;
然后,您可以使用a对您的依赖项
执行一些有用的操作:
公共类主{
公共静态void main(字符串[]args)引发异常{
字符串输入=“####end.start#######foo.bar mu foo.x”;
解复用器lexer=新的解复用器(新的AntlInputStream(输入));
DepParser=newdepparser(newcommontokenstream(lexer));
ParseTreeWalker.DEFAULT.walk(新的DepBaseListener(){
@凌驾
public void enterProgram(@NotNull DepParser.ProgramContext ctx){
对于(TerminalNode节点:ctx.DEPENDENCY()){
System.out.println(“node=“+node.getText());
}
}
},parser.program());
}
}
将打印:
node=end.beginning
node=foo.bar
node=foo.x
node=end.start
node=foo.bar
node=foo.x