2017-05-16 7 views
0

開始時私は悪い英語をお詫びしたい。 私はwebAppを作成し、私の仕事はJavaコードをトークン化することです。私はANTLR v4のようなツールを見つけ、それを実装しようとしました。ANTLR v4でトークン化する方法

public class Tokenizer { 
    public void tokenizer(String code) { 
    ANTLRInputStream in = new ANTLRInputStream(code); 
    Java8Lexer lexer = new Java8Lexer(in); 
    List<? extends Token> tokenList = new ArrayList<>(); 
    tokenList = lexer.getAllTokens(); 
    for(Token token : tokenList){ 
     System.out.println("Next token :" + token.getType() + "\n"); 
    } 
    } 
} 

このコードは、number of token typeのintの画面リストに表示されます。コードへの「コメント」のようなもので

enter image description here

コード: 私はこのようなものが必要。 どうすればこの結果が得られますか? 私はこの文法を持っている:https://github.com/antlr/grammars-v4/tree/master/java8

答えて

0

Tokenクラスには、対応するソースとトークンを関連付ける

int getLine(); 
int getCharPositionInLine(); 

を含むいくつかの方法が含まれています。

0

あなたはトークンが表す解析されたテキストを取得する必要があります

token.getText() 

を使用します。また

、あなたが

lexer.getVocabulary().getSymbolicName(token.getType()) 
+0

こんにちは、ありがとうございました。 コードは次のようになります。 'public void tokenizer(String code){ \t \t ANTLRInputStream in = new ANTLRInputStream(code); \t Java8Lexerレクサー=新しいJava8Lexer(入力); \tリスト<? extends Token> tokenList = new ArrayList <>(); \t tokenList = lexer.getAllTokens(); (トークントークン:tokenList)用\t \t \t \t \t { \t \t \t \tのSystem.out.println(lexer.getVocabulary()getSymbolicName(token.getType()))。 \t} \t} に}」 が私を返し ヌル ヌル ヌル ヌル... 方法token.getText()入力コードからの要素を私に文字列を返す... – Daxter44

+0

私はに鉱山にあなたのコードをコピーANTLR4 Java8文法で実行します。 識別子 識別子 SEMI INT 識別子 SEMI 識別子 ASSIGN IntegerLiteral SEMI RPAREN LPAREN 識別子 GT IntegerLiteral IF LBRACE 識別子 ASSIGN StringLiteral SEMI :出力は私に次のようになりますRBRACE ELSE LBRACE 識別子 ASSIGN StringLiteral SEMI RBRACE – Malte

+0

あなたはあなたの例に示すように、より抽象的な知を抽出したい場合は、トークンストリームを解析し、TreeWalkerのでパースツリーをトラバースしなければなりません。パーサには、照会するボキャブラリもあります。 – Malte

0

によってトークンの名前を取得する必要がありますが、ここに直面している問題は、出力内のトークンやルールのミックスをしたいです。たとえば、VARIABLE_DECLARATIONは実際にはパーサールールですが、IDENTIFIER ASSIGN IDENTIFIERは3つのレクサールールで構成されています。トークンストリームを使用して認識された語彙を印刷することはできますが、パーサールールは得られません。

代わりに試してみることができるのは、戻りパーズツリーを印刷することです。これは、入力に対して実際の解析を実行するときに発生します(ParseTree.toString()参照)。パーサー・リスナーを使用すると、解析ツリーをウォークし、ルールに属するテキスト(コンテキスト)とともにルール記述のストリームに変換できます。

関連する問題