2016-05-05 10 views
0

まもなく、私はANTLR4を実装してBaseListener<Void>を生成しました。ANTLR4 - >訪問者からのレクサーシンボルへのアクセス

@Override 
public Void visitTerminal(TerminalNode node) { 

    if (";".equals(node.getText())) 
     this.prepareQuery(); 
    else if (",".equals(node.getText())) 
     this.prepareQuery(); 

    return super.visitTerminal(node); 
} 

これら";"","を避けるためのいくつかの方法があります:

私はトークンが1つまたは別のあるかどうかを確認する必要が

、私はのようなものをやっていますか? ?

SCOL : ';'; 
COMMA : ','; 

は私がLexer.SCOL(...)、またはLexer.COMMA.equals(...)ような何かを書くことができます:: 私は、これは私の文法上のレクサールールとしてトークンを宣言したことから、これを理解してい

答えて

0

あなたはレクサー・タイプを取得することができますnode.getSymbol()。getType();経由でノードから。

+0

申し訳ありませんが、私はと非常にできないよ:

ので、交換が可能ですが'node '.getSymbol()。getType()' int '戻り値の関係を調べる' ';' 'や' '、' 'に従っています。 int型の戻り値は何ですか? "node.getSymbol()。getType()"を使って ''; equals(...) 'をどうやって置き換えることができるのですか? – Jordi

+0

ああ、私はあなたがレクサーのシンボルをテキストから生成することを知っていました。パーサを使って作業するときに最初に学ぶことの1つです。 –

0

Antlr4は各レクサールールが含まれていGrammLexer生成:

@Override 
public Void visitTerminal(TerminalNode node) { 

    if (GrammLexer.SCOL == node.getSymbol().getType())) 
     this.prepareQuery(); 
    else if (GrammLexer.COMMA == node.getText().getType()) 
     this.prepareQuery(); 

    return super.visitTerminal(node); 
} 

あるいは、

@Override 
public Void visitTerminal(TerminalNode node) { 

    switch (node.getSymbol().getType()) 
    { 
     case GrammarLexer.SCOL: 
      break; 
     case GrammarLexer.COMMA: 
      break; 
    } 

    return super.visitTerminal(node); 
} 
関連する問題