Ayrıştırılmış dosyanın adını aldınız mı?

İlk satırın "proje" isminin bir tanımını içerebileceği veya içermeyebileceği bir dosyayı (Pascal'ın programı anahtar kelimesiyle olduğu gibi) ayrıştırmak istiyorum ve eğer değilse, dosyanın adını varsayılan olarak ayrıştırılıyor. Basitleştirilmiş:

@members{ String projectName; }

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

Bu mümkün mü? Bunu Google veya antlr el kitabını kullanarak öğrenmek için şaşırtıcı derecede zor buldum. Kendi belgelerine göre input.getSourceName() aradığım şey olmalıdır, ancak her zaman null değerini döndürür ve hata ayıklama beni ANTLRStringStream sınıfına yönlendirir. > Bu yöntemle değeri döndürülen ancak asla ayarlanmayan alan adı .

2

1 cevap

Yalnızca çözümleyicinizde dosyanızı temsil eden bir dize alan özel bir kurucu oluşturun.

Bir demo:

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

hangi ile test edilebilir:

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

Ana sınıfı çalıştırırsanız, konsolunuza aşağıdakiler yazdırılır:

empty.txt
JustATest
3
katma