Package ca.mcgill.sable.sablecc; Helpers all = [0 .. 0xFFFF]; lowercase = ['a' .. 'z']; digit = ['0' .. '9']; hex_digit = [digit + [['a' .. 'f'] + ['A' .. 'F']]]; tab = 9; cr = 13; lf = 10; eol = cr lf | cr | lf; not_cr_lf = [all - [cr + lf]]; not_star = [all - '*']; not_star_slash = [not_star - '/']; short_comment = '//' not_cr_lf* eol; long_comment = '/*' not_star* '*'+ (not_star_slash not_star* '*'+)* '/'; id_part = lowercase (lowercase | digit)*; java_letter = ['a' .. 'z'] | ['A' .. 'Z'] | '$' | '_'; java_letter_or_digit = java_letter | ['0' .. '9']; Tokens t_package = 'Package'; t_states = 'States'; t_helpers = 'Helpers'; t_tokens = 'Tokens'; t_ignored = 'Ignored'; t_productions = 'Productions'; t_token_specifier = 'T'; t_production_specifier = 'P'; t_dot = '.'; t_d_dot = '..'; t_semicolon = ';'; t_equal = '='; t_l_bkt = '['; t_r_bkt = ']'; t_l_par = '('; t_r_par = ')'; t_l_brace = '{'; t_r_brace = '}'; t_plus = '+'; t_minus = '-'; t_q_mark = '?'; t_star = '*'; t_bar = '|'; t_comma = ','; t_slash = '/'; t_arrow = '->'; t_colon = ':'; t_id = id_part ('_' id_part)*; t_char = ''' not_cr_lf '''; t_dec_char = digit+; t_hex_char = '0' ('x' | 'X') hex_digit+; t_string = ''' [not_cr_lf - ''']+ '''; t_pkg_id = java_letter java_letter_or_digit*; Ignored Tokens t_blank = (' ' | tab | eol)+; t_comment = short_comment | long_comment; Productions grammar = package_opt helpers_opt states_opt tokens_opt ign_tokens_opt productions_opt; package_opt = package | ; package = t_package pkg_name_opt; pkg_name_opt = pkg_name; pkg_name = pkg_id pkg_name_tails t_semicolon; pkg_name_tails = pkg_name_tail pkg_name_tails | ; pkg_name_tail = t_dot pkg_id; pkg_id = t_package | t_states | t_helpers | t_tokens | t_ignored | t_productions | t_token_specifier | t_production_specifier | t_id | t_pkg_id; helpers_opt = helpers | ; helpers = t_helpers helper_defs; helper_defs = helper_def helper_defs | ; helper_def = t_id t_equal reg_exp t_semicolon; states_opt = states | ; states = t_states id_list_opt t_semicolon; id_list_opt = id_list; id_list = t_id id_list_tails; id_list_tails = id_list_tail id_list_tails | ; id_list_tail = t_comma t_id; tokens_opt = tokens | ; tokens = t_tokens token_defs; token_defs = token_def token_defs | ; token_def = state_list_opt t_id t_equal reg_exp look_ahead_opt t_semicolon; state_list_opt = state_list | ; state_list = t_l_brace t_id transition_opt state_list_tails t_r_brace; state_list_tails = state_list_tail state_list_tails | ; state_list_tail = t_comma t_id transition_opt; transition_opt = transition | ; transition = t_arrow t_id; ign_tokens_opt = ign_tokens | ; ign_tokens = t_ignored t_tokens id_list_opt t_semicolon; look_ahead_opt = look_ahead | ; look_ahead = t_slash reg_exp; reg_exp = concat reg_exp_tails; reg_exp_tails = reg_exp_tail reg_exp_tails | ; reg_exp_tail = t_bar concat; concat = un_exps; un_exps = un_exp un_exps | ; un_exp = basic un_op_opt; basic = p_char | p_set | t_string | t_id | t_l_par reg_exp t_r_par; p_char = t_char | t_dec_char | t_hex_char; p_set = t_l_bkt basic bin_op basic t_r_bkt | t_l_bkt p_char t_d_dot p_char t_r_bkt; un_op_opt = un_op | ; un_op = t_star | t_q_mark | t_plus; bin_op = t_plus | t_minus; productions_opt = productions | ; productions = t_productions prods; prods = prod prods | ; prod = t_id t_equal alts t_semicolon; alts = alt alts_tails; alts_tails = alts_tail alts_tails | ; alts_tail = t_bar alt; alt = alt_name_opt elems | t_l_par alt_name_opt elems t_r_par; alt_name_opt = alt_name | ; alt_name = t_l_brace t_id t_r_brace; elems = elem elems | ; elem = elem_name_opt specifier_opt t_id un_op_opt; elem_name_opt = elem_name | ; elem_name = t_l_bkt t_id t_r_bkt t_colon; specifier_opt = specifier | ; specifier = t_token_specifier t_dot | t_production_specifier t_dot;