Package edu.oswego.hci.hci590.MatrixMiniJDIFF; Helpers character = (['a'..'z']|['A'..'Z']); digit = ['0'..'9']; blankspace = ' '; cr = 13; lf = 10; tabulator = 9; otherascii = [[32..127] - [cr + lf]]; Tokens classs = 'class'; public = 'public'; static = 'static'; void = 'void'; main = 'main'; extends = 'extends'; return = 'return'; new = 'new'; super = 'super'; this = 'this'; boolean = 'boolean'; int = 'int'; string = 'String'; if = 'if'; else = 'else'; while = 'while'; println = 'System.out.println'; and = '&&'; lessthan = '<'; plus = '+'; minus = '-'; mult = '*'; period = '.'; length = 'length'; true = 'true'; false = 'false'; not = '!'; assign = '='; semi = ';'; comma = ','; leftparen = '('; rightparen = ')'; parenpair = '()'; leftsquare = '['; rightsquare = ']'; bracketpair = '[]'; doublebracketpair = '[[]]'; //added for MatrixMiniJ doubleleftbracket = '[['; //added for MatrixMiniJ doublerightbracket = ']]'; //added for MatrixMiniJ leftcurly = '{'; rightcurly = '}'; quote = '"'; singlequote = '''; equal = '=='; whitespace = (blankspace | tabulator)+; comment = '//' (blankspace | tabulator)* otherascii* (cr | lf | cr lf)?; new_line = cr | lf | cr lf; id = character (character | ['0'..'9'] | '_')*; intlit = ['0'..'9']+; Ignored Tokens comment, new_line, whitespace; Productions program = {prog} mainclass class_declaration*; mainclass = {class_main} classs [class_name]:id [class_left]:leftcurly public static void main [arg_main_left]:leftparen string bracketpair [arr_name]:id [arg_main_right]:rightparen [method_left]:leftcurly statement [method_right]:rightcurly [class_right]:rightcurly; class_declaration = {non_public_class} classs id extend? leftcurly variable_declaration* method_declaration* rightcurly; extend = {extends} extends id; variable_declaration = {v_declaration} type id semi | {v_array_declaration_init} type id assign array_declaration semi | {v_matrix_declaration_init} type id assign matrix_declaration semi | {v_declaration_init} type id assign intlit semi; method_declaration = {m_declaration} public type id formal_or_not leftcurly method_body; method_body = {m_body} variable_declaration* statement* return exp semi rightcurly; formal_or_not = {no_formal_list} parenpair | {formal_list} leftparen formallist? rightparen; formallist = {formal_list} type id formallistrest*; formallistrest = {formal_list_rest} comma type id; type = {int_arr} int bracketpair | {int_matrix} int doublebracketpair //added for MatrixMiniJ | {type_boolean} boolean | {type_int} int | {type_id} id; statement = {if_statement} if_statement | {if_else_statement} if_else_statement | {while} while leftparen exp rightparen statement | {non_special_statement} non_special_statement; block = {block} leftcurly statement* rightcurly; if_statement = {if_statement} if leftparen exp rightparen statement; if_else_statement = {if_else_statement} if leftparen exp rightparen else_statement else statement; non_special_statement = {block} block | {expression} expression | {println} println leftparen [left]:quote? exp [right]:quote? rightparen semi | {nothing} nothing; nothing = {empty} semi; expression = {expression} expression2 semi; expression2 = {assignment} assignment | {method_call} method_call | {class_instantiation} class_instantiation; else_statement = {non_special_statement} non_special_statement | {if_else_statement2} if_else_statement2 | {while_statement2} while_statement2; if_else_statement2 = if leftparen exp rightparen [if_statement1]:non_special_statement else [if_statement2]:non_special_statement; while_statement2 = while leftparen exp rightparen non_special_statement; return_statement = return exp? semi; literal = {literal} id | {intlit} intlit | {bool} boolean_literal; primary = {primary_no_declaration} primary_no_declaration | {array_declaration} array_declaration | {matrix_declaration} matrix_declaration; //added for MatrixMiniJ array_declaration = {primitive_type} new type leftsquare exp? rightsquare; matrix_declaration = {primitive_type} new type doubleleftbracket matrix_exp? doublerightbracket; //added for MatrixMiniJ matrix_exp = {matrix_expression} exp exp2; //added for MatrixMiniJ primary_no_declaration = {length} arr_length | {literal} literal | {this} this | {leftparen} leftparen exp rightparen | {new_object} class_instantiation | {field_access} field_access | {method_call} method_call | {array_access} array_access | {matrix_access} matrix_access; //added for MatrixMiniJ arr_length = {length} primary period length | {length_obj} name period length; class_instantiation = {class_instance} new name parenpair; method_call = {method_call} primary period id arg_list | {n} name period id arg_list; arg_list = {parenpair} parenpair | {arg} leftparen arg_list2 rightparen; arg_list2 = {exp} exp exp2*; exp2 = {exp2} comma exp; field_access = {primary} primary period id; array_access = {name} name leftsquare exp rightsquare | {primary_no_declaration} primary_no_declaration leftsquare exp rightsquare; matrix_access = {name} name doubleleftbracket exp exp2 doublerightbracket //added for MatrixMiniJ | {primary_no_declaration} primary_no_declaration doubleleftbracket exp exp2 doublerightbracket; //added for MatrixMiniJ unary_exp = {plus} plus unary_exp | {minus} minus unary_exp | {unary_exp2} unary_exp2; unary_exp2 = {postfix_expression} postfix_expression | {not_unary_exp} not unary_exp; postfix_expression = {primary} primary | {name} name; multi_expression = {unary_exp} unary_exp | {multiplication} multi_expression mult unary_exp; add_expression = {multi_expression} multi_expression | {plus} add_expression plus multi_expression | {minus} add_expression minus multi_expression; shift_expression = {add_expression} add_expression; relational_expression = {lessthan} relational_expression lessthan shift_expression | {shift_expression} shift_expression; equality_expression = {relational_expression} relational_expression; conditional_expression = {conditional_and_expression} conditional_and_expression; conditional_and_expression = {eq_placeholder} eq_placeholder | {conditional_and_expression} conditional_and_expression and relational_expression; eq_placeholder = {equality_expression} equality_expression; assignment_expression = {conditional_expression} conditional_expression | {assignment} assignment; assignment = left_hand_side assignment_operator assignment_expression; assignment_operator = {assign} assign; left_hand_side = {id} id | {field_access} field_access | {array_access} array_access | {matrix_access} matrix_access; //added for MatrixMiniJ exp = {assignment} assignment_expression; constant_expression = exp; boolean_literal = {true} true | {false} false; integer_literal = {decimal} intlit; name = id;