mini java

重新写一个 java 时间有限,只能先实现一个核心功能。

所以需要对 java 多一些特性的简化。

文本主要收集一些网上资料,做下简单的整理。

EBNF Grammar for Mini-Java

  [plaintext]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Goal = MainClass, { ClassDeclaration }, EOF; MainClass = "class", Identifier, "{", "public", "static", "void", "main", "(", "String", "[", "]", Identifier, ")", "{", Statement, "}", "}"; ClassDeclaration = "class", Identifier, [ "extends", Identifier ], "{", { VarDeclaration }, { MethodDeclaration } "}"; VarDeclaration = Type, Identifier, ";"; MethodDeclaration = "public", Type, Identifier, "(", [ Type, Identifier, { ",", Type, Identifier }, ], ")", "{", { VarDeclaration }, { Statement }, "return", Expression, ";", "}"; Type = "int", "[", "]" | "boolean" | "int" | Identifier ; Statement = "{", { Statement }, "}" | "if", "(", Expression, ")", Statement, "else", Statement | "while", "(", Expression, ")", Statement | "System.out.println", "(" , Expression, ")", ";" | Identifier, "=", Expression, ";" | Identifier, "[", Expression, "]", "=", Expression, ";" ; Expression = Expression , ( "&&" | "<" | "+" | "-" | "*" ) , Expression | Expression, "[", Expression, "]" | Expression, ".", "length" | Expression, ".", Identifier, "(", [ Expression { ",", Expression } ], ")" | IntegerLiteral | "true" | "false" | Identifier | "this" | "new", "int", "[", Expression, "]" | "new", Identifier ,"(" ,")" | "!", Expression | "(", Expression, ")" ; Identifier is one or more letters, digits, and underscores, starting with a letter IntegerLiteral is one or more decimal digits EOF is a distinguished token returned by the scanner at end-of-file

EBNF

  [plaintext]
1
2
3
4
5
ISO/IEC 14977: 1996(E) Terminal symbols are quoted [ and ] indicate optional symbols { and } indicate repetition ( and ) group items together; the other brackets do too

MiniJava字符集

MiniJava程序是由US-ASCII字符组成的文本文件。 (这与Java不同。)

Java注释

Comments are // to end of line and /* ... */, just as in Java.

The /* ... */ comments do not nest in Java.

For example,

  [java]
1
2
3
4
5
/* One commment /* Nested comment */ Bad things will happen */

第二个 /* 将被忽略(在注释中),第一个 */ 将终止注释。

现在,“不好的事情将会发生”,因为剩下的文字不是注释。

Appel,第2版,第484页,将MiniJava中的注释描述为可嵌套的。

对于扫描仪来说,这是一个有趣的练习,但不正确。

MiniJava应该是Java的子集。

在实际中,每个非法Java程序都应该是非法Mini-Java程序。

例如,

  [java]
1
2
3
4
5
class Main { void m() { int goto = 3; // 'goto' is a reserved word in Java } }

与Java中一样,带有未初始化变量的Mini-Java程序应该是非法的。 我认为不可能用不可达的语句(在Java中是非法的)编写Mini-Java程序。

Java关键字

MiniJava中没有使用许多Java关键字。 有关Java关键字的详细信息,请查阅Java 13语言规范。

Java的简化

为了简化编程项目,我们进行了以下简化:

没有Unicode逸出。

没有文字为null。

没有测试原始相等性或引用相等性。

方法中的五个或更少的形式参数。

没有方法被覆盖。

没有方法被重载。

(但是,如果需要,您可以包括这些功能。)

但是,最小的Mini-Java编译器必须包含以下功能:

子类和子类多态性。

继承的字段和方法。

参考资料

《现代编译原理 java》

mini_java_grammar

mini java 系列