MiniJava的语法

[url=http://www.cambridge.org/us/features/052182060X/mjreference/mjreference.html]MiniJava语言参考[/url]。引用自[i]Modern Compiler Implementation in Java, Second Edition[/i],Appendix A, Page 484-486。

下面是MiniJava语法的EBNF。粗体蓝色的表示terminals,斜体的是non-terminals。星号(*)表示出现0或多次。
[quote][size=medium][i]Program[/i] → [i]MainClass[/i] [i]ClassDecl[/i]*
[i]MainClass[/i] → [color=blue][b]class[/b][/color] [i]id[/i] [color=blue][b]{ public static void main(String[ ][/b][/color] [i]id[/i][color=blue][b]) {[/b][/color] [i]Statement[/i]* [color=blue][b]} }[/b][/color]
[i]ClassDecl[/i] → [color=blue][b]class[/b][/color] id [color=blue][b]{[/b][/color] [i]VarDecl[/i]* [i]MethodDecl[/i]* [color=blue][b]}[/b][/color]
[color=white]_________[/color] → [color=blue][b]class[/b][/color] [i]id[/i] [color=blue][b]extends[/b][/color] [i]id[/i] [color=blue][b]{[/b][/color] [i]VarDecl[/i]* [i]MethodDecl[/i]* [color=blue][b]}[/b][/color]
[i]VarDecl[/i] → [i]Type id[/i] [color=blue][b];[/b][/color]
[i]MethodDecl[/i] → [color=blue][b]public[/b][/color] [i]Type id[/i] [color=blue][b]([/b][/color] [i]FormalList[/i] [color=blue][b]) {[/b][/color] [i]VarDecl[/i]* [i]Statement[/i]* [color=blue][b]return[/b][/color] [i]Exp[/i][color=blue][b]; }[/b][/color]
[i]FormalList[/i] → [i]Type id FormalRest[/i]*
[color=white]_________[/color] →
[i]FormalRest[/i] → [color=blue][b],[/b][/color] [i]Type id[/i]
[i]Type[/i] → [color=blue][b]int[][/b][/color]
[color=white]____[/color] → [color=blue][b]boolean[/b][/color]
[color=white]____[/color] → [color=blue][b]int[/b][/color]
[color=white]____[/color] → [i]id[/i]
[i]Statement[/i] → [color=blue][b]{[/b][/color] [i]Statement[/i]* [color=blue][b]}[/b][/color]
[color=white]_________[/color] → [color=blue][b]if ([/b][/color] [i]Exp[/i] [color=blue][b])[/b][/color] [i]Statement[/i] [color=blue][b]else[/b][/color] [i]Statement[/i]
[color=white]_________[/color] → [color=blue][b]while ([/b][/color] [i]Exp[/i] [color=blue][b])[/b][/color] [i]Statement[/i]
[color=white]_________[/color] → [color=blue][b]System.out.println([/b][/color][i]Exp[/i][color=blue][b]);[/b][/color]
[color=white]_________[/color] → [i]id[/i] [color=blue][b]=[/b][/color] [i]Exp[/i][color=blue][b];[/b][/color]
[color=white]_________[/color] → [i]id[/i][color=blue][b][[/b][/color][i]Exp[/i][color=blue][b]] =[/b][/color] [i]Exp[/i][color=blue][b];[/b][/color]
[i]Exp[/i] → [i]Exp op Exp[/i]
[color=white]___[/color] → [i]Exp[/i] [color=blue][b][[/b][/color][i]Exp[/i][color=blue][b]][/b][/color]
[color=white]___[/color] → [i]Exp[/i] [color=blue][b].length[/b][/color]
[color=white]___[/color] → [i]Exp[/i] [color=blue][b].[/b][/color] [i]id[/i] [color=blue][b]([/b][/color][i]ExpList[/i][color=blue][b])[/b][/color]
[color=white]___[/color] → [i]INTEGER_LITERAL[/i]
[color=white]___[/color] → [color=blue][b]true[/b][/color]
[color=white]___[/color] → [color=blue][b]false[/b][/color]
[color=white]___[/color] → [i]id[/i]
[color=white]___[/color] → [color=blue][b]this[/b][/color]
[color=white]___[/color] → [color=blue][b]new int[[/b][/color][i]Exp[/i][color=blue][b]][/b][/color]
[color=white]___[/color] → [color=blue][b]new[/b][/color] [i]id[/i][color=blue][b]( )[/b][/color]
[color=white]___[/color] → [color=blue][b]![/b][/color][i]Exp[/i]
[color=white]___[/color] → [color=blue][b]([/b][/color][i]Exp[/i][color=blue][b])[/b][/color]
[i]ExpList[/i] → [i]Exp ExpRest[/i]*
[color=white]_______[/color] →
[i]ExpRest[/i] → [color=blue][b],[/b][/color] [i]Exp[/i][/size][/quote]
(注释:[i]op[/i]表示二元运算符,可以是: && < + - *的任意一个;
[color=blue][b].length[/b][/color]只能作用于[color=blue][b]int[][/b][/color]类型的变量上。)

本来是想找找比较简单的实例,看看别人是如何实现类(class)的作用域的。然而这MiniJava真作 弊,居然强制要求变量声明在方法声明之前,于是我遇到的问题在一定程度上给避开了。Hmm……我再想想看怎么办好……
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值