質問

基本的には、ファイル内で、定義されたすべての式を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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top