diff options
author | Adrian Thurston <thurston@colm.net> | 2019-09-09 09:34:14 -0600 |
---|---|---|
committer | Adrian Thurston <thurston@colm.net> | 2019-09-09 09:34:14 -0600 |
commit | 2d8e9c3f5c0417d6237c945c50f92bf8d28b32d5 (patch) | |
tree | e463c784309e402c1c7bb89247596165b07ad8d1 /test/cases/colm.d/exit6.lm | |
parent | c0323a27ad612db4fa7d3d5c25c3e9611bcf874b (diff) | |
parent | c171cdda894fa59515d1bdc1e00cace185366e7f (diff) | |
download | colm-2d8e9c3f5c0417d6237c945c50f92bf8d28b32d5.tar.gz |
mega-merge of pruned test code
Diffstat (limited to 'test/cases/colm.d/exit6.lm')
-rw-r--r-- | test/cases/colm.d/exit6.lm | 926 |
1 files changed, 926 insertions, 0 deletions
diff --git a/test/cases/colm.d/exit6.lm b/test/cases/colm.d/exit6.lm new file mode 100644 index 00000000..3595d93e --- /dev/null +++ b/test/cases/colm.d/exit6.lm @@ -0,0 +1,926 @@ +rl ident + /( alpha | '_' ) ( alpha | digit | '_' )*/ + +rl number + / digit+ / + +rl hex_number + / '0x' [0-9a-fA-F]+ / + +rl NL / '\n' / + +rl c_comment + / '/*' ( any | NL )* :>> '*/' / + +rl cpp_comment + / '//' [^\n]* NL / + +rl s_literal + / "'" ([^'\\] | NL | '\\' (any | NL))* "'" / + +rl d_literal + / '"' ([^"\\] | NL | '\\' (any | NL))* '"' / + +namespace srlex + lex + ignore /[\t\n ]+/ + literal `:: `; `) + token word /[a-zA-Z_][a-zA-Z0-9_]*/ + end +end + +namespace c_inline + lex + literal `fpc `fc `fcurs `ftargs + `fentry `fhold `fexec `fgoto `fnext + `fcall `fret `fbreak + + token ident /ident/ + token number /digit+/ + token hex_number /'0x' [0-9a-fA-F]+/ + + token comment + / c_comment | cpp_comment / + + token string + / s_literal | d_literal / + + token whitespace + / ( [ \t] | NL )+ / + + literal `{ `} `:: `* `, `( `) `; + + token c_any / any / + end + + def inline_expr + [expr_item*] + + def expr_item + [expr_any] :ExprAny + | [expr_symbol] :ExprSymbol + | [expr_interpret] :ExprInterpret + + def expr_any + [whitespace] + | [comment] + | [string] + | [number] + | [hex_number] + | [ident] + | [c_any] + + def expr_symbol + [`,] | [`(] | [`)] | [`*] | [`::] + + def expr_interpret + [`fpc] :Fpc + | [`fc] :Fc + | [`fcurs] :Fcurs + | [`ftargs] :Ftargs + | [`fentry `( state_ref srlex::`)] :Fentry + + def state_ref + [opt_name_sep state_ref_names] + + def opt_name_sep + [srlex::`::] :ColonColon + | [] :Empty + + # List of names separated by :: + def state_ref_names + [state_ref_names srlex::`:: srlex::word] :Rec + | [srlex::word] :Base + + def inline_block + [block_item*] + + def block_item + [expr_any] :ExprAny + | [block_symbol] :BlockSymbol + | [block_interpret] :BlockInterpret + | [`{ inline_block `}] :RecBlock + + def block_symbol + [`,] | [`;] | [`(] | [`)] | [`*] | [`::] + + def block_interpret + [expr_interpret] :ExprInterpret + | [`fhold whitespace? `;] :Fhold + | [`fgoto whitespace? `* inline_expr `;] :FgotoExpr + | [`fnext whitespace? `* inline_expr `;] :FnextExpr + | [`fcall whitespace? `* inline_expr `;] :FcallExpr + | [`fexec inline_expr `;] :Fexec + | [`fgoto state_ref srlex::`;] :FgotoSr + | [`fnext state_ref srlex::`;] :FnextSr + | [`fcall state_ref srlex::`;] :FcallSr + | [`fret `;] :Fret + | [`fbreak `;] :Fbreak +end + +namespace ragel + lex + ignore /[\t\n ]+/ + ignore /'#' any* :> '\n'/ + + literal `^ `| `- `, `: `! `? `. + literal `( `) `{ `} `* `& `+ + + literal `-- `:> `:>> `<: `-> `** + + literal `|* `*| `=> + + literal `@ `> `< `% `$ + literal `from `to `eof `lerr `err + literal `when `inwhen `outwhen `>? `$? `%? + + literal `:= `= `; `.. `:: + + literal `>~ `$~ `%~ `<~ `@~ `<>~ + literal `>* `$* `%* `<* `@* `<>* + literal `>/ `$/ `%/ `</ `@/ `<>/ + literal `>! `$! `%! `<! `@! `<>! + literal `>^ `$^ `%^ `<^ `@^ `<>^ + literal `<> + + literal `machine `action `variable `alphtype `import + `access `write `getkey `export `include + `prepush `postpop + + token string / + '"' ( [^"\\] | '\\' any )* '"' 'i'? | + "'" ( [^'\\] | '\\' any )* "'" 'i'? + / + + token lex_regex_open /'/'/ -ni + token lex_sqopen_pos /'['/ -ni + token lex_sqopen_neg /'[^'/ -ni + + token word /[a-zA-Z_][a-zA-Z0-9_]*/ + token uint / number / + token hex / hex_number / + end + + lex + token re_dot / '.' / + token re_star / '*' / + token re_char / ^( '\\' | '.' | '*' | '[' | '/' ) | '\\' . any / + token re_close / '/' / + token re_sqopen_pos /'['/ + token re_sqopen_neg /'[^'/ + end + + lex + token re_or_dash / '-' / + token re_or_char / ^( '\\' | '-' | ']' ) | '\\' . any / + token re_or_sqclose / ']' / + end + + # Not cannot start with '{', terminated by ';', rewritten into { inline_expr } + token _inline_expr_reparse + /[^{;] [^;]* ';'/ { + R: str = input->pull( match_length - 1 ) + input->pull( 1 ) + input->push( "}" ) + input->push( R ) + input->push( "{" ) + } + + token variable_name /ident/ + + def inline_expr_reparse + [_inline_expr_reparse] + | [action_expr] + + def join + [join `, expression] :Rec + | [expression] :Base + + def expression + [term expression_op*] + + def expression_op + [`| term] :Or + | [`& term] :And + | [`- term] :Sub + | [`-- term] :Ssub + + def term + [factor_label term_op_list_short] + + # This list is done manually to get shortest match. + def term_op_list_short + [] :Empty + | [term_op term_op_list_short] :Terms + + def term_op + [factor_label] :None + | [`. factor_label] :Dot + | [`:> factor_label] :ColonLt + | [`:>> factor_label] :ColonLtLt + | [`<: factor_label] :GtColon + + def factor_label + [word `: factor_label] :Label + | [factor_ep] :Ep + + def factor_ep + [factor_aug `-> epsilon_target] :Epsilon + | [factor_aug] :Base + + def epsilon_target + [epsilon_target `:: word] :Rec + | [word] :Base + + def action_expr + [`{ c_inline::inline_expr `}] + + def action_block + [`{ c_inline::inline_block `}] + + def action_ref + [word] :Word + | [`( word `)] :ParenWord + | [action_block] :Block + + def priority_aug + [uint] + | [`+ uint] + | [`- uint] + + def aug_base + [`@] :Finish | [`>] :Enter | [`%] :Leave | [`$] :All + + def aug_cond + [`>?] :Start1 | [`$?] :All1 | [`%?] :Leave1 + | [`> `when] :Start2 | [`$ `when] :All2 | [`% `when] :Leave2 + | [`inwhen] :Start3 | [`when] :All3 | [`outwhen] :Leave3 + + def aug_to_state + [`>~] :Start1 | [`<~] :NotStart1 | [`$~] :All1 + | [`%~] :Final1 | [`@~] :NotFinal1 | [`<>~] :Middle1 + | [`> `to] :Start2 | [`< `to] :NotStart2 | [`$ `to] :All2 + | [`% `to] :Final2 | [`@ `to] :NotFinal2 | [`<> `to] :Middle2 + + def aug_from_state + [`>*] :Start1 | [`<*] :NotStart1 | [`$*] :All1 + | [`%*] :Final1 | [`@*] :NotFinal1 | [`<>*] :Middle1 + | [`> `from] :Start2 | [`< `from] :NotStart2 | [`$ `from] :All2 + | [`% `from] :Final2 | [`@ `from] :NotFinal2 | [`<> `from] :Middle2 + + def aug_eof + [`>/] :Start1 | [`</] :NotStart1 | [`$/] :All1 + | [`%/] :Final1 | [`@/] :NotFinal1 | [`<>/] :Middle1 + | [`> `eof] :Start2 | [`< `eof] :NotStart2 | [`$ `eof] :All2 + | [`% `eof] :Final2 | [`@ `eof] :NotFinal2 | [`<> `eof] :Middle2 + + def aug_gbl_error + [`>!] :Start1 | [`<!] :NotStart1 | [`$!] :All1 + | [`%!] :Final1 | [`@!] :NotFinal1 | [`<>!] :Middle1 + | [`> `err] :Start2 | [`< `err] :NotStart2 | [`$ `err] :All2 + | [`% `err] :Final2 | [`@ `err] :NotFinal2 | [`<> `err] :Middle2 + + def aug_local_error + [`>^] :Start1 | [`<^] :NotStart1 | [`$^] :All1 + | [`%^] :Final1 | [`@^] :NotFinal1 | [`<>^] :Middle1 + | [`> `lerr] :Start2 | [`< `lerr] :NotStart2 | [`$ `lerr] :All2 + | [`% `lerr] :Final2 | [`@ `lerr] :NotFinal2 | [`<> `lerr] :Middle2 + + def factor_aug + [factor_aug aug_base action_ref] :ActionRef + | [factor_aug aug_base priority_aug] :PriorEmbed + | [factor_aug aug_base `( word `, priority_aug `)] :NamedPriorEmbed + | [factor_aug aug_cond action_ref] :CondEmbed + | [factor_aug aug_cond `! action_ref] :NegCondEmbed + | [factor_aug aug_to_state action_ref] :ToStateAction + | [factor_aug aug_from_state action_ref] :FromStateAction + | [factor_aug aug_eof action_ref] :EofAction + | [factor_aug aug_gbl_error action_ref] :GblErrorAction + | [factor_aug aug_local_error action_ref] :LocalErrorDef + | [factor_aug aug_local_error `( word `, action_ref `)] :LocalErrorName + | [factor_rep] :Base + + def factor_rep + [factor_neg factor_rep_op*] + + def factor_rep_op + [`*] :Star + | [`**] :StarStar + | [`?] :Optional + | [`+] :Plus + | [`{ factor_rep_num `}] :ExactRep + | [`{ `, factor_rep_num `}] :MaxRep + | [`{ factor_rep_num `, `}] :MinRep + | [`{ LowRep: factor_rep_num `, HighRep: factor_rep_num `}] :RangeRep + + def factor_rep_num + [uint] + + def factor_neg + [`! factor_neg] :Bang + | [`^ factor_neg] :Caret + | [factor] :Base + + def factor + [alphabet_num] :AlphabetNum + | [word] :Word + | [string] :String + | [lex_sqopen_pos reg_or_data re_or_sqclose] :PosOrBlock + | [lex_sqopen_neg reg_or_data re_or_sqclose] :NegOrBlock + | [lex_regex_open regex re_close] :Regex + | [RL1: range_lit `.. RL2: range_lit] :Range + | [`( join `)] :Join + + def regex + [reg_item_rep*] + + def reg_item_rep + [reg_item re_star] :Star + | [reg_item] :Base + + def reg_item + [re_sqopen_pos reg_or_data re_or_sqclose] :PosOrBlock + | [re_sqopen_neg reg_or_data re_or_sqclose] :NegOrBlock + | [re_dot] :Dot + | [re_char] :Char + + def reg_or_data + [reg_or_data reg_or_char] :Data + | [] :Base + + def reg_or_char + [re_or_char] :Char + | [Low: re_or_char re_or_dash High: re_or_char] :Range + + def range_lit + [string] :String + | [alphabet_num] :AN + + def alphabet_num + [uint] + | [`- uint] + | [hex] + + def lm_act + [`=> action_ref] :ActionRef + | [action_block] :ActionBlock + + def opt_lm_act + [lm_act] + | [] + + def lm_stmt + [join opt_lm_act `;] :LmStmt commit + | [assignment] :Assignment + | [action_spec] :ActionSpec + + def lm_stmt_list + [lm_stmt_list lm_stmt] :Rec + | [lm_stmt] :Base + + def lm + [join] :Join + | [`|* lm_stmt_list `*|] :Lm + + def action_spec + [`action word action_block] commit + + def assignment + [opt_export word `= join `;] commit + + def instantiation + [opt_export word `:= lm `;] commit + + def alphtype_type + [W1: word] :One + | [W1: word W2: word] :Two + + def include_spec + [word] + | [string] + | [word string] + + def opt_export + [`export] :Export + | [] :Base + + def machine_name + [`machine word `;] + + def statement + [machine_name] :MachineName commit + | [assignment] :Assignment + | [instantiation] :Instantiation + | [action_spec] :ActionSpec + | [`prepush action_block] :PrePushSpec commit + | [`postpop action_block] :PostPopSpec commit + | [`variable variable_name inline_expr_reparse] :Variable commit + | [`alphtype alphtype_type `;] :AlphType commit + | [`access inline_expr_reparse] :Access commit + | [`write Cmd: word ArgList: word* `;] :Write commit + | [`getkey inline_expr_reparse] :GetKey commit + | [`import string `;] :Import commit + | [`include include_spec `;] :Include commit + + def ragel_start + [statement*] +end + +namespace c_host + lex + literal `%%{, `}%% + + token slr /'%%' [^{] [^\n]* '\n'/ + { + input->pull( 2 ) + R: str = input->pull( match_length - 3 ) + input->push( "}%%" ) + input->push( R ) + input->push( "%%{" ) + } + + rl NL / '\n' / + + rl ruby_comment / '#' [^\n]* NL / + + rl s_literal + / "'" ([^'\\] | NL | '\\' (any | NL))* "'" / + + rl d_literal + / '"' ([^"\\] | NL | '\\' (any | NL))* '"' / + + rl host_re_literal + / '/' ([^/\\] | NL | '\\' (any | NL))* '/' / + + token ident /ident/ + token number /digit+/ + token hex_number /'0x' [0-9a-fA-F]+/ + + token comment + /c_comment | cpp_comment/ + + token string + / s_literal | d_literal / + + token whitespace + / ( [ \t] | NL )+ / + + token c_any / any / + end + + def tok + [ident] + | [number] + | [hex_number] + | [comment] + | [string] + | [whitespace] + | [c_any] + + def section + [`%%{ ragel::ragel_start `}%%] :MultiLine + | [tok] :Tok +end + + +lex + literal `%%{ `}%% + + literal `int `bool `const `char `ptr `printi + `printb `prints `print_token + `fwrite `first_token_char `var `byte + + literal `; `< `> `( `) `[ `] `= `* `! + + ignore / ( [ \t] | NL )+ / + + token tk_ident /ident/ + token tk_number /digit+/ + token tk_hex_number /'0x' [0-9a-fA-F]+/ + + rl INPUT /'_'+ 'INPUT' '_'+/ + rl OUTPUT /'_'+ 'OUTPUT' '_'+/ + + token ifdef_INPUT + / '#ifdef' ' '* INPUT / + + token ifdef_OUTPUT + / '#ifdef' ' '* OUTPUT ' '* '\n' / -ni + + token endif + / '#endif' / + + token tk_cpp_comment + / cpp_comment / + + token c_comm_open + / '/*' / + + token string + / s_literal | d_literal / + + token indep_any / any / +end + +lex + token output_endif / '#endif\n' / + token output_line /[^\n]* '\n'/ +end + + +lex + token comm_val /'@' [A-Za-z0-9_]+ ': ' [^\n]+ '\n' / + token comm_term /'*/'/ + token comm_any / any / +end + +def comm_item + [comm_val] +| [comm_any] + +def c_comment + [c_comm_open comm_item* comm_term] + +def input_string + [string] + +def input_list + [input_list input_string] +| [input_string] + +def input + [ifdef_INPUT input_list endif] + +def output + [ifdef_OUTPUT output_line* output_endif] + +def tok + [tk_ident] +| [tk_ident `[ tok `]] +| [tk_number] +| [tk_hex_number] +| [input] +| [output] +| [tk_cpp_comment] +| [c_comment] +| [string] +| [`< type `> `( tok* `)] +| [`( type `) `( tok* `)] +| [`( tok* `)] +| [`printi tok `;] +| [`printb tok `;] +| [`prints tok `;] +| [`print_token `;] +| [`first_token_char] +| [`;] +| [`<] +| [`>] +| [`[] +| [`]] +| [`=] +| [`!] +| [`*] +| [indep_any] + +def section_multiline + [`%%{ ragel::ragel_start `}%%] + +def type + [`int] +| [`bool] +| [`char] +| [`char `*] +| [`const `( `char `) `*] +| [`ptr] +| [`byte] + +def opt_arr + [`[ tok `]] +| [] + +def var_decl + [type tk_ident opt_arr `;] +| [`var tk_ident opt_arr type] + +def expr_stmt + [tk_ident `= tok* `;] + +def stmt + [var_decl] +| [expr_stmt] + +def section + [section_multiline] +| [stmt] +| [tok] + +def start + [section*] + +namespace c + lex + literal `%%{, `}%% + + literal `int `bool `const `char `ptr + `printf `fwrite `var `byte + + literal `; `< `> `( `) `[ `] `= `* `! + + ignore / ( [ \t] | NL )+ / + + token tk_ident /ident/ + token tk_number /digit+/ + token tk_hex_number /'0x' [0-9a-fA-F]+/ + + token string + / s_literal | d_literal / + + token indep_any / any / + end + + def tok + [tk_ident] + | [tk_ident `[ tok `]] + | [tk_number] + | [tk_hex_number] + | [string] + | [`< type `> `( tok* `)] + | [`( type `) `( tok* `)] + | [`( tok* `)] + | [`printf `( tok* `) `;] + | [`fwrite `( tok* `) `;] + | [`;] + | [`<] + | [`>] + | [`[] + | [`]] + | [`=] + | [`!] + | [`*] + | [indep_any] +end + +OutputFile: str = '/dev/stdout' +InputFile: str = '/dev/stdin' +Lang: str = 'c' + +Input: stream = open( InputFile, "r" ) +Output: stream = open( OutputFile, "w" ) + +RagelTree: start = parse start[ Input ] + +if ( !RagelTree ) { + print( error, '\n' ) + exit(1) +} + +# Find the machine name. +MachineName: ragel::machine_name = ragel::machine_name in RagelTree + +# Do we need EOF? +NeedsEof: bool = false +for CommVal: comm_val in RagelTree { + if $CommVal == + '@NEEDS_EOF: yes\n' + { + NeedsEof = true + } +} + +send Output + "/* + " * @LANG: [Lang] + " * @GENERATED: yes + " */ + " + "#include <string.h> + "#include <stdio.h> + " + +iter i() +{ + S: str = "1" + yield S +} + +int indepToHost( Indep: ref<section*> ) +{ + for Decl: var_decl in Indep { + if match Decl + "bool [Ident: tk_ident OptArr: opt_arr]; + { + Decl = cons var_decl + "int [Ident OptArr]; + } + elsif match Decl + "ptr [Ident: tk_ident]; + { + Decl = cons var_decl + "char* [Ident]; + } + } + + for Tok: any in i() { + exit(9) + } +} + +for Section: section in RagelTree { + if match Section [Decl: var_decl] { + cons SectionList: section* [Decl] + indepToHost( SectionList ) + send Output [SectionList] + } +} + +for Section: section in RagelTree { + if match Section [section_multiline] { + for Action: ragel::action_block in Section { + # Reparse as lang-independent code. + parse SectionList: section*[$Action] + + # Translate to specific language. + indepToHost( SectionList ) + + # Reparse back to ragel action block. + Action = parse ragel::action_block[$SectionList] + } + + send Output ["\n" Section "\n"] + } +} + +send Output + "%% write data; + "int cs; + " + "void init() + "{ + +for Section: section in RagelTree { + if match Section [ExprStmt: expr_stmt] { + cons SectionList: section* [ExprStmt] + indepToHost( SectionList ) + send Output [SectionList] + } +} + +send Output + " %% write init; + "} + " + "void exec( char *data, int len ) + "{ + " char *p = data; + " char *pe = data + len; + +if NeedsEof { + send Output + " char *eof = pe; +} + +send Output + " %% write exec; + "} + " + "void finish( ) + "{ + " if ( cs >= [$MachineName.word]_first_final ) + " printf( \"ACCEPT\\n\" ); + " else + " printf( \"FAIL\\n\" ); + "} + " + +send Output + "char *inp\[\] = { + +NR: int = 0 +for InputString: input_string in RagelTree { + send Output + [^InputString ",\n"] + NR = NR + 1 +} + +send Output + "}; + " + +send Output + "int inplen = [NR]; + " + +send Output + "int main( ) + "{ + " int i; + " for ( i = 0; i < inplen; i++ ) { + " init(); + " exec( inp\[i\], strlen(inp\[i\]) ); + " finish(); + " } + " return 0; + "} + " + +send Output "/* _____OUTPUT_____ +for OutputLine: output_line in RagelTree { + send Output [OutputLine] + exit(1) +} +send Output "*/ + +# iter i() +#{ +#} + +for I: any in i() { + Int: int = 1 +} + +for I: any in rev_child( RagelTree ) { + Int: int = 1 +} + +#### IN #### +/* + * @LANG: indep + */ +bool neg; +int val; + +val = 0; +neg = false; +%%{ + machine AtoI; + + action begin { + neg = false; + val = 0; + } + + action see_neg { + neg = true; + } + + action add_digit { + val = val * 10 + <int>(fc - 48); + } + + action finish { + if ( neg != 0 ) { + val = -1 * val; + } + } + action print { + printi val; + prints "\n"; + } + + atoi = ( + ('-'@see_neg | '+')? (digit @add_digit)+ + ) >begin %finish; + + main := atoi '\n' @print; +}%% + +#ifdef _____INPUT_____ +"1\n" +"12\n" +"222222\n" +"+2123\n" +"213 3213\n" +"-12321\n" +"--123\n" +"-99\n" +" -3000\n" +#endif + +#ifdef _____OUTPUT_____ +1 +ACCEPT +12 +ACCEPT +222222 +ACCEPT +2123 +ACCEPT +FAIL +-12321 +ACCEPT +FAIL +-99 +ACCEPT +FAIL +#endif +#### EXP #### +/* + * @LANG: c + * @GENERATED: yes + */ + +#include <string.h> +#include <stdio.h> + +#### EXIT #### +9 |