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

.java源文件可以以哪个字符或标记开头?,java,java-7,Java,Java 7,我可以想出以下方法来启动.java文件(每行是一个单独的.java文件): 除上述文件外,还编译空文件和仅包含ASCII子(十进制26)字符的文件 还有其他我错过的吗 请忽略开头的空白。如果它不是以ASCII字母开头,则只计算第一个字符(例如,不需要提及/,因为我们已经提到了/*),否则第一个单词将计算。最终/摘要类类名..有关全面的描述,请参阅JLS中的和。预期令牌列表如下所示 Sub WhiteSpace Comment EOF ';' '@' 'abstract' 'class' 'enu

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

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

还有其他我错过的吗


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

最终/摘要类类名..

有关全面的描述,请参阅JLS中的和。

预期令牌列表如下所示

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

  • 下载的,它是从
  • 为它生成一个解析器,例如使用命令行
    -ll2-backtrack-java-tree-main
  • 在生成的代码中,在方法
    parse\u Input
    中找到起始符号的初始lexer调用。它被精确地标注为Java7源文件开头所期望的标记
该代码如下所示:

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

Abstract/public/private但是为什么这很重要呢?java类不能是抽象的,或者不能有通常的访问器修饰符(public、private、default、protected…)?仅供参考
protected
private
static
只允许用于内部类。我刚刚添加了
abstract
final
public
,因为它们都能工作。@vikingsteve:这对于编写多语言程序很重要,例如以多种语言编译的源文件。Sub是什么意思?Sub的第一个单词是什么?在本答案中提到但问题中没有提到的标记中,只有
strictfp
工作,其他会导致编译错误(解析错误除外),例如
本机类C{}
不编译。我已经更新了这个问题,加入了新的有效的标记。我喜欢这个答案,因为它解释了为什么其他标记不可能。@pts,我同意
native
。尽管语法定义允许它,以及所有其他
修饰符
s,但它将被语义检查拒绝。因此,这表明语法方法只提供启动有效Java文件的标记的超集
Sub
是这样指定的:
作为与某些操作系统兼容的特殊让步,如果ASCII子字符(\u001a或control-Z)是转义输入流中的最后一个字符,则忽略它。
(请参阅)感谢您的澄清,我已将Sub添加到问题中。
lookahead1W(90);                // Sub | WhiteSpace | Comment | EOF | ';' | '@' | 'abstract' | 'class' | 'enum' |
                                // 'final' | 'import' | 'interface' | 'native' | 'package' | 'private' |
                                // 'protected' | 'public' | 'static' | 'strictfp' | 'synchronized' | 'transient' |
                                // 'volatile'