diff options
author | Adrian Thurston <thurston@colm.net> | 2020-03-14 15:29:52 +0200 |
---|---|---|
committer | Adrian Thurston <thurston@colm.net> | 2020-03-14 15:29:52 +0200 |
commit | f653735830d537715f2885bd832cf04851d35401 (patch) | |
tree | 95e6551e39407543366d4f49aedf7b78c6e8bbe1 /src/colm.lm | |
parent | bcc54d5df10cf425e7134b06f70d7ffe1abee4e4 (diff) | |
download | colm-f653735830d537715f2885bd832cf04851d35401.tar.gz |
moved source files into commit repository
Diffstat (limited to 'src/colm.lm')
-rw-r--r-- | src/colm.lm | 910 |
1 files changed, 910 insertions, 0 deletions
diff --git a/src/colm.lm b/src/colm.lm new file mode 100644 index 00000000..c95d0c41 --- /dev/null +++ b/src/colm.lm @@ -0,0 +1,910 @@ +# Main region. +lex + token DEF / 'def' / + token LEX / 'lex' / + token END / 'end' / + token TOKEN / 'token' / + token RL / 'rl' / + token IGNORE / 'ignore' / + token PRINT / 'print' / + token PRINTS / 'prints' / + token PARSE / 'parse' / + token REDUCE / 'reduce' / + token READ_REDUCE /'read_reduce'/ + token PARSE_TREE / 'parse_tree' / + token PARSE_STOP / 'parse_stop' / + token CONS / 'construct' | 'cons' / + token MATCH / 'match' / + token REQUIRE / 'require' / + token SEND / 'send' / + token SEND_TREE / 'send_tree' / + token NAMESPACE / 'namespace' / + token REDUCTION / 'reduction' / + token FOR / 'for' / + token IF / 'if' / + token YIELD / 'yield' / + token WHILE / 'while' / + token ELSIF / 'elsif' / + token ELSE / 'else' / + token IN / 'in' / + token PARSER / 'parser' | 'accum' / + token LIST / 'list' / + token LIST_EL / 'list_el' / + token MAP / 'map' / + token MAP_EL / 'map_el' / + token PTR / 'ptr' / + token ITER / 'iter' / + token REF / 'ref' / + token EXPORT / 'export' / + token RETURN / 'return' / + token BREAK / 'break' / + token REJECT / 'reject' / + token REDUCEFIRST / 'reducefirst' / + token ALIAS / 'alias' / + token COMMIT / 'commit' / + token NEW / 'new' / + token PREEOF / 'preeof' / + token GLOBAL / 'global' / + token EOS / 'eos' / + token CAST / 'cast' / + token SWITCH / 'switch' / + token CASE / 'case' / + token DEFAULT / 'default' / + token INT / 'int' / + token BOOL / 'bool' / + token VOID / 'void' / + + token MAKE_TOKEN / 'make_token' / + token MAKE_TREE / 'make_tree' / + + token TYPEID / 'typeid' / + + token LITERAL / 'literal' / + token CONTEXT / 'context' / + token STRUCT / 'struct' / + token NI /'ni'/ + + token NIL / 'nil' / + token TRUE / 'true' / + token FALSE / 'false' / + + token LEFT /'left'/ + token RIGHT /'right'/ + token NONASSOC /'nonassoc'/ + + token INCLUDE /'include'/ + + token id / + ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) . + ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* + / + + token number + / ( '0' .. '9' ) + / + + token backtick_lit / + '`' . + ^( ' ' | '\n' | '\t' ) . + ^( ' ' | '\n' | '\t' | '`' | ']' )* . + ( '`' | '' ) + / + + token DQ / '\"' / - ni + token SQ / '\'' / - ni + token TILDE / '~' / - ni + + token SQOPEN /'['/ + token SQCLOSE /']'/ + token BAR /'|'/ + token FSLASH /'/'/ + token COLON /':'/ + token DOUBLE_COLON /'::'/ + token DOT /'.'/ + token ARROW /'->'/ + token POPEN /'('/ + token PCLOSE /')'/ + token COPEN /'{'/ + token CCLOSE /'}'/ + token STAR /'*'/ + token QUESTION /'?'/ + token EQUALS /'='/ + token EQEQ /'=='/ + token NEQ /'!='/ + token COMMA /','/ + token LT /'<'/ + token GT /'>'/ + token LTEQ /'<='/ + token GTEQ /'>='/ + token BANG /'!'/ + token DOLLAR /'$'/ + token CARET /'^'/ + token AT /'@'/ + token PERCENT /'%'/ + token PLUS /'+'/ + token MINUS /'-'/ + token AMPAMP /'&&'/ + token BARBAR /'||'/ + + ignore / ( '\n' | '\t' | ' ' )+ / + ignore / '#' . ( ^'\n' )* . '\n' / +end + +lex + token LIT_DQ / '\"' / + token LIT_DQ_NL / '\n' / + token LIT_SQOPEN / '[' / + token LIT_SQCLOSE / ']' / + + token lit_dq_data + / ( ^( '\n' | '\"' | '[' | ']' | '\\' ) | '\\' . any )+ / +end + +lex + token CONS_SQ / '\'' / + token CONS_SQ_NL / '\n' / + + token sq_cons_data + / ( ^( '\n' | '\'' | '\\' ) | '\\' . any )+ / +end + +lex + token TILDE_NL / '\n' / + token tilde_data + / ( ^'\n' )+ / +end + +lex + token lex_id / + ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) . + ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* + / + + token lex_uint + / ( '0' .. '9' )+ / + + token lex_hex + / '0x' . ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' )+ / + + token lex_lit / + '\'' . ( ^( '\'' | '\\' ) | '\\' . any )* . ( '\'' | '\'i' ) | + '\"' . ( ^( '\"' | '\\' ) | '\\' . any )* . ( '\"' | '\"i' ) + / + + token LEX_DOT /'.'/ + token LEX_BAR /'|'/ + token LEX_AMP /'&'/ + token LEX_DASH /'-'/ + token LEX_POPEN /'('/ + token LEX_PCLOSE /')'/ + token LEX_STAR /'*'/ + token LEX_STARSTAR /'**'/ + token LEX_QUESTION /'?'/ + token LEX_PLUS /'+'/ + token LEX_CARET /'^'/ + token LEX_DOTDOT /'..'/ + token LEX_SQOPEN_POS /'['/ - ni + token LEX_SQOPEN_NEG /'[^'/ - ni + token LEX_FSLASH /'/'/ + + token LEX_DASHDASH /'--'/ + token LEX_COLON_GT /':>'/ + token LEX_COLON_GTGT /':>>'/ + token LEX_LT_COLON /'<:'/ + + ignore / + ( '\n' | '\t' | ' ' ) . + ( '\n' | '\t' | ' ' )* + / + + ignore / '#' . ( ^'\n' )* . '\n' / +end + +lex + token RE_DASH / '-' / + token RE_CHAR / ^( '\\' | '-' | ']' ) | '\\' . any / + token RE_SQCLOSE / ']' / +end + +def start + [RootItemList: root_item<*] + +def root_item + [rl_def] :Rl commit +| [literal_def] :Literal commit +| [token_def] :Token commit +| [ic_def] :IgnoreCollector commit +| [ignore_def] :Ignore commit +| [cfl_def] :Cfl commit +| [region_def] :Region commit +| [struct_def] :Struct commit +| [namespace_def] :Namespace commit +| [function_def] :Function commit +| [in_host_def] :InHost commit +| [iter_def] :Iter commit +| [statement] :Statement commit +| [global_def] :Global commit +| [export_def] :Export commit +| [pre_eof_def] :PreEof commit +| [precedence_def] :Precedence commit +| [alias_def] :Alias commit +| [_include] :Include commit +| [reduction_def] :Reduction commit + +def _include + [INCLUDE SQ SqConsDataList: sq_cons_data<* sq_lit_term] + +def precedence_def + [pred_type pred_token_list] + +def pred_type + [LEFT] :Left +| [RIGHT] :Right +| [NONASSOC] :NonAssoc + +def pred_token_list + [pred_token_list COMMA pred_token] :List +| [pred_token] :Base + +def pred_token + [region_qual id] :Id +| [region_qual backtick_lit] :Lit + +def pre_eof_def + [PREEOF COPEN lang_stmt_list CCLOSE] + +def alias_def + [ALIAS id type_ref] + +def struct_item + [struct_var_def] :StructVar commit +| [literal_def] :Literal commit +| [rl_def] :Rl commit +| [token_def] :Token commit +| [ic_def] :IgnoreCollector commit +| [ignore_def] :Ignore commit +| [cfl_def] :Cfl commit +| [region_def] :Region commit +| [struct_def] :Struct commit +| [function_def] :Function commit +| [in_host_def] :InHost commit +| [iter_def] :Iter commit +| [export_def] :Export commit +| [pre_eof_def] :PreEof commit +| [precedence_def] :Precedence commit +| [alias_def] :Alias commit + +def export_def + [EXPORT var_def opt_def_init] + +def global_def + [GLOBAL var_def opt_def_init] + +def iter_def + [ITER id POPEN ParamVarDefList: param_var_def_list PCLOSE + COPEN lang_stmt_list CCLOSE] + +def reference_type_ref + [REF LT type_ref GT] + +def param_var_def_seq + [param_var_def COMMA param_var_def_seq] +| [param_var_def] + +def param_var_def_list + [param_var_def_seq] +| [] + +def param_var_def + [id COLON type_ref] :Type +| [id COLON reference_type_ref] :Ref + +def opt_export + [EXPORT] :Export +| [] + +def function_def + [opt_export type_ref id + POPEN ParamVarDefList: param_var_def_list PCLOSE + COPEN lang_stmt_list CCLOSE] + +def in_host_def + [opt_export type_ref id + POPEN ParamVarDefList: param_var_def_list PCLOSE + EQUALS HostFunc: id] + +def struct_var_def + [var_def] + +def struct_key + [STRUCT] | [CONTEXT] + +def struct_def + [struct_key id ItemList: struct_item<* END] + +def literal_keyword + [LITERAL] +| [TOKEN] + +def literal_def + [literal_keyword literal_list] + +def literal_list + [literal_list literal_item] :Item +| [literal_item] :Base + +def literal_item + [no_ignore_left backtick_lit no_ignore_right] + +def no_ignore_left + [NI MINUS] :Ni +| [] + +def no_ignore_right + [MINUS NI] :Ni +| [] + +def reduction_def + [REDUCTION id ItemList: reduction_item<* END] + +lex + token RED_OPEN / '{' / + token RED_CLOSE / '}' / + + token red_id / + ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) . + ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' )* + / + + token red_comment / + '//' . ( ^'\n' )* . '\n' | + '/*' . any* :> '*/' + / + + token red_ws / + ( '\n' | '\t' | ' ' )+ + / + + token red_lit / + '\'' . ( ^( '\'' | '\\' ) | '\\' . any )* . ( '\'' | '\'i' ) | + '\"' . ( ^( '\"' | '\\' ) | '\\' . any )* . ( '\"' | '\"i' ) + / + + token RED_LHS / '$' . '$' / + token RED_RHS_REF / '$' . red_id / + token RED_RHS_LOC / '@' . red_id / + token RED_TREE_REF / '$*' . red_id / + + token RED_RHS_NREF / '$' . ('1' .. '9') . ('0' .. '9')* / + token RED_RHS_NLOC / '@' . ('1' .. '9') . ('0' .. '9')* / + token RED_TREE_NREF / '$*' . ('1' .. '9') . ('0' .. '9')* / + + token red_any / any / +end + +def red_nonterm + [type_ref RED_OPEN HostItems: host_item<* RED_CLOSE] + +def red_action + [type_ref COLON id RED_OPEN HostItems: host_item<* RED_CLOSE] + +def host_item + [red_id] +| [red_lit] +| [red_comment] +| [red_ws] +| [red_any] +| [RED_LHS] +| [RED_RHS_REF] +| [RED_TREE_REF] +| [RED_RHS_LOC] +| [RED_RHS_NREF] +| [RED_TREE_NREF] +| [RED_RHS_NLOC] +| [RED_OPEN HostItems: host_item<* RED_CLOSE] + +def reduction_item + [red_nonterm] :NonTerm commit +| [red_action] :Action commit + +def namespace_def + [NAMESPACE id ItemList: namespace_item<* END] + +def namespace_item + [rl_def] :Rl commit +| [literal_def] :Literal commit +| [token_def] :Token commit +| [ic_def] :IgnoreCollector commit +| [ignore_def] :Ignore commit +| [cfl_def] :Cfl commit +| [region_def] :Region commit +| [struct_def] :Struct commit +| [namespace_def] :Namespace commit +| [function_def] :Function commit +| [in_host_def] :InHost commit +| [iter_def] :Iter commit +| [pre_eof_def] :PreEof commit +| [precedence_def] :Precedence commit +| [alias_def] :Alias commit +| [_include] :Include commit +| [global_def] :Global commit + +def obj_var_list + [] + +def opt_reduce_first + [REDUCEFIRST] +| [] + +def cfl_def + [DEF id + VarDefList: var_def<* + opt_reduce_first + prod_list] + +def region_def + [LEX RootItemList: root_item<* END] + +def rl_def + [RL id LEX_FSLASH lex_expr LEX_FSLASH] + +def opt_lex_expr + [lex_expr] +| [] + +def token_def + [TOKEN id VarDefList: var_def<* + no_ignore_left + LEX_FSLASH opt_lex_expr LEX_FSLASH + no_ignore_right + opt_translate] + +def ic_def + [TOKEN id MINUS] + +def opt_translate + [COPEN lang_stmt_list CCLOSE] :Translate +| [] + +def opt_id + [id] :Id +| [] + +def ignore_def + [IGNORE opt_id LEX_FSLASH opt_lex_expr LEX_FSLASH] + +def prod_sublist + [prod_sublist BAR prod_el_list] +| [prod_el_list] + +def prod_el + [opt_prod_el_name region_qual id opt_repeat] :Id +| [opt_prod_el_name region_qual backtick_lit opt_repeat] :Lit +| [opt_prod_el_name POPEN prod_sublist PCLOSE opt_repeat ] :SubList + +def opt_prod_el_name + [id COLON] :Name +| [] + +def prod_el_list + [prod_el_list prod_el] :List +| [] + +def opt_commit + [COMMIT] :Commit +| [] + +def opt_prod_name + [COLON id] :Name +| [] + +def prod + [SQOPEN prod_el_list SQCLOSE + opt_prod_name + opt_commit + opt_reduce] + +def opt_reduce + [COPEN lang_stmt_list CCLOSE] :Reduce +| [] + +def prod_list + [prod_list BAR prod] :List +| [prod] :Base + +def case_clause + [CASE pattern block_or_single] :Pattern commit +| [CASE id block_or_single] :Id commit +| [CASE id pattern block_or_single] :IdPat commit + +def default_clause + [DEFAULT block_or_single] commit + +def case_clause_list + [case_clause case_clause_list] :Recursive +| [case_clause] :BaseCase +| [default_clause] :BaseDefault + +# Note a commit on switch doesn't work because the default clause in +# case_clause follow sets cause a premature commit. We could use a proper list +# for case clauses, followed by an optional default, but just move the commits +# to the clauses, which is is a better commit strategy anyways. Gives more +# regular commits. + +def statement + [print_stmt] :Print commit +| [var_def opt_def_init] :VarDef commit +| [FOR id COLON type_ref IN iter_call block_or_single] :For commit +| [IF code_expr block_or_single elsif_list] :If commit +| [SWITCH var_ref case_clause_list] :SwitchUnder +| [SWITCH var_ref COPEN case_clause_list CCLOSE] :SwitchBlock +| [WHILE code_expr block_or_single] :While commit +| [var_ref EQUALS code_expr] :LhsVarRef commit +| [YIELD var_ref] :Yield commit +| [RETURN code_expr] :Return commit +| [BREAK] :Break commit +| [REJECT] :Reject commit +| [var_ref POPEN call_arg_list PCLOSE] :Call +| [stmt_or_factor] :StmtOrFactor +| [accumulate opt_eos] :BareSend + +def elsif_list + [elsif_clause elsif_list] :Clause +| [optional_else] :OptElse + +def elsif_clause + [ELSIF code_expr block_or_single] + +def optional_else + [ELSE block_or_single] :Else +| [] + +def call_arg_seq + [code_expr COMMA call_arg_seq] +| [code_expr] + +def call_arg_list + [call_arg_seq] +| [] + +def iter_call + [E1 var_ref POPEN call_arg_list PCLOSE] :Call +| [E2 id] :Id +| [E3 code_expr] :Expr + +def block_or_single + [COPEN lang_stmt_list CCLOSE] :Block +| [statement] :Single + +def require_pattern + [REQUIRE var_ref pattern] + +def opt_require_stmt + [require_pattern lang_stmt_list] :Require +| [] :Base + +def lang_stmt_list + [StmtList: statement<* opt_require_stmt] + +def opt_def_init + [EQUALS code_expr] :Init +| [] :Base + +def var_def + [id COLON type_ref] + +def print_stmt + [PRINT POPEN call_arg_list PCLOSE] :Tree +| [PRINTS POPEN var_ref COMMA call_arg_list PCLOSE] :PrintStream +| [PRINT accumulate] :Accum + +def expr_stmt + [code_expr] + +def code_expr + [code_expr AMPAMP code_relational] :AmpAmp +| [code_expr BARBAR code_relational] :BarBar +| [code_relational] :Base + +def code_relational + [code_relational EQEQ code_additive] :EqEq +| [code_relational NEQ code_additive] :Neq +| [code_relational LT code_additive] :Lt +| [code_relational GT code_additive] :Gt +| [code_relational LTEQ code_additive] :LtEq +| [code_relational GTEQ code_additive] :GtEq +| [code_additive] :Base + +def code_additive + [code_additive PLUS code_multiplicitive] :Plus +| [code_additive MINUS code_multiplicitive] :Minus +| [code_multiplicitive] :Base + +def code_multiplicitive + [code_multiplicitive STAR code_unary] :Star +| [code_multiplicitive FSLASH code_unary] :Fslash +| [code_unary] :Base + +def code_unary + [BANG code_factor] :Bang +| [DOLLAR code_factor] :Dollar +| [DOLLAR DOLLAR code_factor] :DollarDollar +| [CARET code_factor] :Caret +| [AT code_factor] :At +| [PERCENT code_factor] :Percent +| [code_factor] :Base + +def opt_eos + [DOT] :Dot +| [EOS] :Eos +| [] + +def code_factor + [number] :Number +| [var_ref POPEN call_arg_list PCLOSE] :Call +| [var_ref] :VarRef +| [NIL] :Nil +| [TRUE] :True +| [FALSE] :False +| [POPEN code_expr PCLOSE] :Paren +| [string] :String +| [type_ref IN var_ref] :In +| [TYPEID LT type_ref GT] :TypeId +| [CAST LT type_ref GT code_factor] :Cast +| [stmt_or_factor] :StmtOrFactor + +def type_ref + [region_qual id opt_repeat] :Id +| [INT] :Int +| [BOOL] :Bool +| [VOID] :Void +| [PARSER LT type_ref GT] :Parser +| [LIST LT type_ref GT] :List +| [MAP LT KeyType: type_ref COMMA ValType: type_ref GT] :Map +| [LIST_EL LT type_ref GT] :ListEl +| [MAP_EL LT KeyType: type_ref COMMA ValType: type_ref GT] :MapEl + +def region_qual + [region_qual id DOUBLE_COLON] :Qual +| [] :Base + +def opt_repeat + [STAR] :Star +| [PLUS] :Plus +| [QUESTION] :Question +| [LT STAR] :LeftStar +| [LT PLUS] :LeftPlus +| [] + +def opt_capture + [id COLON] :Id +| [] + +def opt_field_init + [POPEN FieldInitList: field_init<* PCLOSE] :Init +| [] :Base + +def field_init + [code_expr] + +def stmt_or_factor + [PARSE opt_capture type_ref opt_field_init accumulate] :Parse +| [PARSE_TREE opt_capture type_ref opt_field_init accumulate] :ParseTree +| [PARSE_STOP opt_capture type_ref opt_field_init accumulate] :ParseStop +| [REDUCE id type_ref opt_field_init accumulate] :Reduce +| [READ_REDUCE id type_ref opt_field_init accumulate] :ReadReduce +| [SEND var_ref accumulate opt_eos] :Send +| [SEND_TREE var_ref accumulate opt_eos] :SendTree +| [MAKE_TREE POPEN call_arg_list PCLOSE] :MakeTree +| [MAKE_TOKEN POPEN call_arg_list PCLOSE] :MakeToken +| [CONS opt_capture type_ref opt_field_init constructor] :Cons +| [MATCH var_ref pattern] :Match +| [NEW opt_capture type_ref POPEN FieldInitList: field_init<* PCLOSE] :New + +# +# Pattern +# + +def opt_label + [id COLON] :Id +| [] + +def dq_lit_term + [LIT_DQ] | [LIT_DQ_NL] + +def sq_lit_term + [CONS_SQ] | [CONS_SQ_NL] + +def opt_tilde_data + [tilde_data] +| [] + +def pattern_el_lel + [region_qual id opt_repeat] :Id +| [region_qual backtick_lit opt_repeat] :Lit + +def pattern_el + [opt_label pattern_el_lel] :PatternEl +| [DQ LitpatElList: litpat_el<* dq_lit_term] :Dq +| [SQ SqConsDataList: sq_cons_data<* sq_lit_term] :Sq +| [TILDE opt_tilde_data TILDE_NL] :Tilde + +def litpat_el + [lit_dq_data] :ConsData +| [LIT_SQOPEN PatternElList: pattern_el<* LIT_SQCLOSE] :SubList + +def pattern_top_el + [DQ LitpatElList: litpat_el<* dq_lit_term] :Dq +| [SQ SqConsDataList: sq_cons_data<* sq_lit_term] :Sq +| [TILDE opt_tilde_data TILDE_NL] :Tilde + +def pattern_list + [pattern_top_el pattern_list] :List +| [pattern_top_el] :Base + +def pattern + [pattern_list] :TopList +| [SQOPEN PatternElList: pattern_el<* SQCLOSE] :SubList + +# +# Constructor List +# + +def E1 [] +def E2 [] +def E3 [] +def E4 [] + +def cons_el + [E1 region_qual backtick_lit] :Lit +| [E1 DQ LitConsElList: lit_cons_el<* dq_lit_term] :Dq +| [E1 SQ SqConsDataList: sq_cons_data<* sq_lit_term] :Sq +| [E1 TILDE opt_tilde_data TILDE_NL] :Tilde +| [E2 code_expr] :CodeExpr + +def lit_cons_el + [lit_dq_data] :ConsData +| [LIT_SQOPEN ConsElList: cons_el<* LIT_SQCLOSE] :SubList + +def cons_top_el + [DQ LitConsElList: lit_cons_el<* dq_lit_term] :Dq +| [SQ SqConsDataList: sq_cons_data<* sq_lit_term] :Sq +| [TILDE opt_tilde_data TILDE_NL] :Tilde + +def cons_list + [cons_top_el cons_list] :List +| [cons_top_el] :Base + +def constructor + [cons_list] :TopList +| [SQOPEN ConsElList: cons_el<* SQCLOSE] :SubList + +# +# Accumulate +# + +def accum_el + [E1 DQ LitAccumElList: lit_accum_el<* dq_lit_term] :Dq +| [E1 SQ SqConsDataList: sq_cons_data<* sq_lit_term] :Sq +| [E1 TILDE opt_tilde_data TILDE_NL] :Tilde +| [E2 code_expr] :CodeExpr + +def lit_accum_el + [lit_dq_data] :ConsData +| [LIT_SQOPEN AccumElList: accum_el<* LIT_SQCLOSE] :SubList + +def accum_top_el + [DQ LitAccumElList: lit_accum_el<* dq_lit_term] :Dq +| [SQ SqConsDataList: sq_cons_data<* sq_lit_term] :Sq +| [TILDE opt_tilde_data TILDE_NL] :Tilde +| [SQOPEN AccumElList: accum_el<* SQCLOSE] :SubList + +def accum_list + [accum_top_el accum_list] :List +| [accum_top_el] :Base + +def accumulate + [accum_list] + +# +# String List +# + +def string_el + [E1 DQ LitStringElList: lit_string_el<* dq_lit_term] :Dq +| [E1 SQ SqConsDataList: sq_cons_data<* sq_lit_term] :Sq +| [E1 TILDE opt_tilde_data TILDE_NL] :Tilde +| [E2 code_expr] :CodeExpr + +def lit_string_el + [lit_dq_data] :ConsData +| [LIT_SQOPEN StringElList: string_el<* LIT_SQCLOSE] :SubList + +def string_top_el + [DQ LitStringElList: lit_string_el<* dq_lit_term] :Dq +| [SQ SqConsDataList: sq_cons_data<* sq_lit_term] :Sq +| [TILDE opt_tilde_data TILDE_NL] :Tilde + +def string_list + [string_top_el string_list] :List +| [string_top_el] :Base + +def string + [string_list] :TopList +| [SQOPEN StringElList: string_el<* SQCLOSE] :SubList + +# +# Variable References +# + +def var_ref + [region_qual qual id] + +def qual + [qual id DOT] :Dot +| [qual id ARROW] :Arrow +| [] :Base + +# +# Lexical analysis. +# + +def lex_expr + [lex_expr LEX_BAR lex_term] :Bar +| [lex_expr LEX_AMP lex_term] :Amp +| [lex_expr LEX_DASH lex_term] :Dash +| [lex_expr LEX_DASHDASH lex_term] :DashDash +| [lex_term] :Base + +def opt_lex_dot + [LEX_DOT] +| [] + +def lex_term + [lex_term opt_lex_dot lex_factor_rep] :Dot +| [lex_term LEX_COLON_GT lex_factor_rep] :ColonGt +| [lex_term LEX_COLON_GTGT lex_factor_rep] :ColonGtGt +| [lex_term LEX_LT_COLON lex_factor_rep] :LtColon +| [lex_factor_rep] :Base + +def lex_factor_rep + [lex_factor_rep LEX_STAR] :Star +| [lex_factor_rep LEX_STARSTAR] :StarStar +| [lex_factor_rep LEX_PLUS] :Plus +| [lex_factor_rep LEX_QUESTION] :Question +| [lex_factor_rep COPEN lex_uint CCLOSE ] :Exact +| [lex_factor_rep COPEN COMMA lex_uint CCLOSE ] :Max +| [lex_factor_rep COPEN lex_uint COMMA CCLOSE ] :Min +| [lex_factor_rep COPEN Low: lex_uint COMMA High: lex_uint CCLOSE ] :Range +| [lex_factor_neg] :Base + +def lex_factor_neg + [LEX_CARET lex_factor_neg] :Caret +| [lex_factor] :Base + +def lex_range_lit + [lex_lit] :Lit +| [lex_num] :Number + +def lex_num + [lex_uint] +| [lex_hex] + +#| [LEX_DASH num] + +def lex_factor + [lex_lit] :Literal +| [lex_id] :Id +| [lex_uint] :Number +| [lex_hex] :Hex +| [Low: lex_range_lit LEX_DOTDOT High: lex_range_lit] :Range +| [LEX_SQOPEN_POS reg_or_data RE_SQCLOSE] :PosOrBlock +| [LEX_SQOPEN_NEG reg_or_data RE_SQCLOSE] :NegOrBlock +| [LEX_POPEN lex_expr LEX_PCLOSE] :Paren + +def reg_or_data + [reg_or_data reg_or_char] :Data +| [] :Base + +def reg_or_char + [RE_CHAR] :Char +| [Low: RE_CHAR RE_DASH High: RE_CHAR] :Range |