解析されたファイルの名前を取得しますか?

最初の行に "project"という名前の定義が含まれていてもいなくてもよいファイルを解析したいとします(Pascalの program キーワードのように)。そうでなければ、デフォルトとして解析されています。簡体字:

@members{ String projectName; }

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

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

2

1 答え

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

デモ:

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());
  }
}

Mainクラスを実行すると、次のものがコンソールに出力されます:

empty.txt
JustATest
3
追加された