.java源文件可以从哪个字符或标记开始?

时间:2013-10-24 08:30:48

标签: java java-7

我可以提出以下方法来启动.java文件(每行是一个单独的.java文件):

package p; class fa {}
import java.net.URL; class fb { URL u; }
class fc {}
interface fd {}
enum fe {}
@Deprecated class ff {}
/**/ class fg {}
\u0063lass fh {}
abstract class fi {}
final class fj {}
public class fk {}
;class fl {}
strictfp class fm {}

除上述文件外,空文件和仅包含ASCII SUB(十进制26)字符的文件也会编译。

还有其他我错过的吗?

请在开头忽略空白。如果它不以ASCII字母开头,则只计算第一个字符(例如,不需要提及//,因为我们已经提到/*),否则第一个字会计数。

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

预期令牌列表是

Sub WhiteSpace Comment EOF ';' '@' 'abstract' 'class' 'enum' 'final' 'import'
'interface' 'native' 'package' 'private' 'protected' 'public' 'static' 
'strictfp' 'synchronized' 'transient' 'volatile'

可以找到如下:

  • 下载Java 7 grammarREx parser generatorJLS (Java SE 7 Edition)来自{{3}}
  • 为其生成解析器,例如使用命令行-ll 2 -backtrack -java -tree -main
  • 在生成的代码中,在方法parse_Input中找到起始符号的初始词法分析器调用。它完全注释了Java 7源文件开头所需的标记。

该代码如下所示:

lookahead1W(90);                // Sub | WhiteSpace | Comment | EOF | ';' | '@' | 'abstract' | 'class' | 'enum' |
                                // 'final' | 'import' | 'interface' | 'native' | 'package' | 'private' |
                                // 'protected' | 'public' | 'static' | 'strictfp' | 'synchronized' | 'transient' |
                                // 'volatile'

答案 2 :(得分:1)

final / abstract class ClassName ..