2011-10-28 16 views
2

最初の行に「プロジェクト」名の定義が含まれている場合と含まれていない場合があります(パスカルのprogramキーワードのように)。そうでない場合は、デフォルトとして解析されているファイルの名前を使用します。簡体字:解析されたファイルの名前を取得しますか?

@members{ String projectName; } 

project : {projectName = ...} // name of parsed file as default 
     (PROJECTNAMEKEYWORD ID {projectName = $ID.text;})? 
      otherstuff {/*...*/}; 

これは可能ですか?私はこれを驚くほど見つけにくいとGoogleやantlrのマニュアルを使って調べました。そのドキュメントでは、input.getSourceName()は私が探しているはずですが、常にnullを返し、デバッグはnameフィールドを持つクラスANTLRStringStreamにつながりますが、このメソッドで値が返されますが設定されることはありません。

答えて

3

ファイルを表す文字列を受け取るカスタムコンストラクタをパーサに作成するだけです。

デモ:

grammar T; 

@parser::members { 
    private String projectName; 

    public TParser(String fileName) throws java.io.IOException { 
    super(new CommonTokenStream(new TLexer(new ANTLRFileStream(fileName)))); 
    projectName = fileName; 
    } 

    public String getProjectName() { 
    return projectName; 
    } 
} 

parse 
    : (PROJECT ID {projectName = $ID.text;})? EOF 
    ; 

PROJECT : 'project'; 
ID  : ('a'..'z' | 'A'..'Z')+; 
SPACE : (' ' | '\t' | '\r' | '\n') {skip();}; 

でテストすることができます。

import org.antlr.runtime.*; 

public class Main { 
    public static void main(String[] args) throws Exception { 

    // 'empty.txt' is, as the name suggests, an empty file 
    TParser parser = new TParser("empty.txt"); 
    parser.parse(); 
    System.out.println(parser.getProjectName()); 

    // 'test.txt' contains a single line with the words: 'project JustATest' 
    parser = new TParser("test.txt"); 
    parser.parse(); 
    System.out.println(parser.getProjectName()); 
    } 
} 

あなたがメインクラスを実行する場合は、次のことがあなたのコンソールに出力されます。

empty.txt 
JustATest 
関連する問題