質問
基本的には、ファイル内で、定義されたすべての式をANTLRを使用して見つけたいと思います :
語.語
例えば :「終わり。始まり"の試合
当分の間、ファイルは数百行と数百行と複雑な構造を持つことができます。
すべてのもの(キャラクター)をスキップする方法はありますか?)それは、ファイルを完全に表す文法を作らずに、上記のパターンと一致しませんか?
これまでのところ、これは私の文法ですが、次に何をすべきかわかりません。
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"
その間にcharがない場合は、単一のレクサールールを作成し、パーサーでそのルールと一致させる必要があります:
grammar Dep;
program
: DEPENDENCY* EOF
;
DEPENDENCY
: [a-zA-Z_] [a-zA-Z0-9_]* '.' [a-zA-Z_] [a-zA-Z0-9_]*
;
OTHER
: . -> skip
;
その後、あなたはaを使うことができます ツリーリスナー あなたの有用な何かをするために 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());
}
}
これは印刷されます:
node=end.beginning node=foo.bar node=foo.x
所属していません StackOverflow