Antlr 获取已解析文件的名称?

Antlr 获取已解析文件的名称?,antlr,Antlr,我想解析一个文件,其中第一行可能包含也可能不包含“项目”名称的定义(如Pascal的程序关键字),如果不包含,则使用正在解析的文件的名称作为默认名称。简化: @members{ String projectName; } project : {projectName = ...} // name of parsed file as default ( PROJECTNAMEKEYWORD ID {projectName = $ID.text;} )?

我想解析一个文件,其中第一行可能包含也可能不包含“项目”名称的定义(如Pascal的
程序
关键字),如果不包含,则使用正在解析的文件的名称作为默认名称。简化:

@members{ String projectName; }

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

这可能吗?我发现使用google或antlr手册很难找到这一点。根据它的文档,
input.getSourceName()
应该是我要查找的,但它总是返回null,通过调试,我找到了类
ANTLRStringStream
,该类有一个
name
字段,该字段的值由该方法返回,但从未设置过。

只需在解析器中创建一个自定义构造函数,该构造函数接受表示文件的字符串

演示:

语法T;
@解析器::成员{
私有字符串projectName;
公共TParser(字符串文件名)抛出java.io.IOException{
super(新的CommonTokenStream(新的TLexer(新的ANTLRFileStream(文件名)));
projectName=文件名;
}
公共字符串getProjectName(){
返回项目名称;
}
}
作语法分析
:(项目ID{projectName=$ID.text;})?EOF
;
项目:"项目";;
ID:('a'..'z'|'a'..'z')+;
空格:(“”|’\t’|’\r’|’\n’{skip();};
可通过以下方式进行测试:

import org.antlr.runtime.*;
公共班机{
公共静态void main(字符串[]args)引发异常{
//顾名思义,“empty.txt”是一个空文件
TParser parser=newTparser(“empty.txt”);
parser.parse();
System.out.println(parser.getProjectName());
//“test.txt”包含一行文字:“project JusteTest”
解析器=新的TParser(“test.txt”);
parser.parse();
System.out.println(parser.getProjectName());
}
}
如果运行Main类,以下内容将打印到控制台:

empty.txt
公正的