Package minijava; Helpers all = [0..127]; all_but_cr = [all - 13]; all_but_crlf = [all_but_cr - 10]; not_star = [all - '*']; not_star_slash = [not_star - '/']; digit = ['0'..'9']; letter = [['a'..'z'] + ['A'..'Z']]; lt = '<'; gt = '>'; plus = '+'; minus = '-'; mult = '*'; and = '&&'; Tokens blank = (' ' | 13 | 10 | 8)+; singlelinecomment = '//' all_but_crlf* (13 | 10 | 13 10); formalcomment = '/*' not_star* '*'+ (not_star_slash not_star* '*'+)* '/'; lparen = '('; rparen = ')'; lsqparen = '['; rsqparen = ']'; lbrace = '{'; rbrace = '}'; semicolon = ';'; dot = '.'; assign = '='; not = '!'; comma = ','; op = (plus | minus | mult | lt | and); boolean = 'boolean'; xclass = 'class'; interface = 'interface'; else = 'else'; extends = 'extends'; false = 'false'; if = 'if'; while = 'while'; integer = 'int'; length = 'length'; main = 'main'; new = 'new'; public = 'public'; return = 'return'; static = 'static'; string = 'String'; this = 'this'; true = 'true'; print = 'System.out.println'; void = 'void'; integer_literal = ( ( ['1'-'9'] ['0'-'9']* ) | '0' ); identifier = letter ( letter | digit | '_')*; Ignored Tokens blank, singlelinecomment, formalcomment; Productions program = mainclass classdecl*; mainclass = xclass [firstid]:identifier [firstlb]:lbrace public static void main lparen string lsqparen rsqparen [secondid]:identifier rparen [secondlb]:lbrace statement [firstrb]:rbrace [secondrb]:rbrace; classdecl = {toplevel} xclass identifier lbrace vardecl* methoddecl* rbrace | {subclass} xclass [firstid]:identifier extends [secondid]:identifier lbrace vardecl* methoddecl* rbrace; vardecl = type identifier semicolon; methoddecl = public type identifier lparen formallist? rparen lbrace vardecl* statement* return exp semicolon rbrace; formallist = type identifier formalrest*; formalrest = comma type identifier; type = {intarray} integer lsqparen rsqparen | {boolean} boolean | {int} integer | {identifier} identifier; statement = {block} lbrace statement* rbrace | {if} if lparen exp rparen [firstst]:statement else [secondst]:statement | {while} while lparen exp rparen statement | {print} print lparen exp rparen semicolon | {assign} identifier assign exp semicolon | {index} identifier lsqparen [firstex]:exp rsqparen assign [secondex]:exp semicolon; exp = {op} [firstex]:expfactor op [secondex]:expfactor | {factor} expfactor | {not} not exp; expfactor = {index} [firstex]:expfactor lsqparen [secondex]:exp rsqparen | {length} expfactor dot length | {call} expfactor dot identifier lparen explist? rparen | {intliteral} integer_literal | {true} true | {false} false | {identifier} identifier | {this} this | {newarray} new integer lsqparen exp rsqparen | {new} new identifier lparen rparen | {nested} lparen exp rparen; explist = exp exprest*; exprest = comma exp;