如何解决Jflex 获取输入文件名
%%
%class displayFilename
%eof{
/* code to print the input filename goes here */
%eof}
%%
\n { /* do nothing */ }
. { /* do nothing */ }
运行的命令
jflex displayFilename
javac displayFilename.java
java displayFilename someinputfile.txt
期望输出:
someinputfile.txt
解决方法
这可以通过省略 jflex 文件顶部的 %standalone
标签来实现。这使得 jflex 不会生成默认的 main()
方法,并允许用户在 main()
代码段内设置自己的自定义 %{ %}
方法。
在此 main()
中,用户可以放置自动生成的 main()
的原始代码,但可以更新为所需的结果。
在这种情况下:
%%
%class DisplayFilename
%{
private static String inputfilename = "";
private static class Yytoken {
/* empty class to allow yylex() to compile */
}
public static void main(String argv[]) {
if (argv.length == 0) {
System.out.println("Usage : java DisplayFilename");
}
else {
int firstFilePos = 0;
String encodingName = "UTF-8";
for (int i = firstFilePos; i < argv.length; i++) {
inputfilename = argv[i]; // LINE OF INTEREST
WC scanner = null;
try {
java.io.FileInputStream stream = new java.io.FileInputStream(argv[i]);
java.io.Reader reader = new java.io.InputStreamReader(stream,encodingName);
scanner = new WC(reader);
while ( !scanner.zzAtEOF ) scanner.yylex();
}
catch (java.io.FileNotFoundException e) {
System.out.println("File not found : \""+argv[i]+"\"");
}
catch (java.io.IOException e) {
System.out.println("IO error scanning file \""+argv[i]+"\"");
System.out.println(e);
}
catch (Exception e) {
System.out.println("Unexpected exception:");
e.printStackTrace();
}
}
}
}
%}
%eof{
/* code to print the input filename goes here */
System.out.println(inputfilename);
%eof}
%%
\n { /* do nothing */ }
. { /* do nothing */ }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。