diff options
author | Adrian Thurston <thurston@complang.org> | 2013-03-23 13:38:07 -0400 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2013-03-23 13:38:07 -0400 |
commit | 9922542d39edd209212541baeac8cfc7def13a83 (patch) | |
tree | d0da0e22bddb2fc877961a2fafbed6209d605d7b | |
parent | 69153ffd853c41064a85f7331e114501d7d4c434 (diff) | |
download | colm-9922542d39edd209212541baeac8cfc7def13a83.tar.gz |
added parse_stop
-rw-r--r-- | colm/colm.lm | 3 | ||||
-rw-r--r-- | colm/load.cc | 10 | ||||
-rw-r--r-- | test/ragelambig1.exp | 1 | ||||
-rw-r--r-- | test/ragelambig1.in | 1 | ||||
-rw-r--r-- | test/ragelambig1.lm | 5 | ||||
-rw-r--r-- | test/ragelambig2.exp | 1 | ||||
-rw-r--r-- | test/ragelambig2.in | 1 | ||||
-rw-r--r-- | test/ragelambig2.lm | 5 | ||||
-rw-r--r-- | test/rediv.exp | 4 | ||||
-rw-r--r-- | test/rediv.in | 1 | ||||
-rw-r--r-- | test/rediv.lm | 8 | ||||
-rw-r--r-- | test/reparse.exp | 1 | ||||
-rw-r--r-- | test/reparse.in | 1 | ||||
-rw-r--r-- | test/reparse.lm | 5 | ||||
-rw-r--r-- | test/rhsref1.exp | 6 | ||||
-rw-r--r-- | test/rhsref1.in | 14 | ||||
-rw-r--r-- | test/rhsref1.lm | 23 | ||||
-rw-r--r-- | test/rubyhere.exp | 9 | ||||
-rw-r--r-- | test/rubyhere.in | 16 | ||||
-rw-r--r-- | test/rubyhere.lm | 28 |
20 files changed, 87 insertions, 56 deletions
diff --git a/colm/colm.lm b/colm/colm.lm index cb9f2266..6369f1bf 100644 --- a/colm/colm.lm +++ b/colm/colm.lm @@ -10,6 +10,7 @@ lex token PRINT_XML / 'print_xml' / token PRINT_XML_AC / 'print_xml_ac' / token PARSE / 'parse' / + token PARSE_STOP / 'parse_stop' / token CONS / 'construct' | 'cons' / token MATCH / 'match' / token REQUIRE / 'require' / @@ -389,6 +390,8 @@ def code_factor | [Send: SEND ToVarRef: var_ref Accumulate: accumulate] | [Parse: PARSE OptCapture: opt_capture TypeRef: type_ref OptFieldInit: opt_field_init Accumulate: accumulate] +| [ParseStop: PARSE_STOP OptCapture: opt_capture TypeRef: type_ref + OptFieldInit: opt_field_init Accumulate: accumulate] | [Cons: CONS OptCapture: opt_capture TypeRef: type_ref OptFieldInit: opt_field_init Constructor: constructor] | [MATCH MatchVarRef: var_ref Pattern: pattern] diff --git a/colm/load.cc b/colm/load.cc index 140d86b5..9b5b6847 100644 --- a/colm/load.cc +++ b/colm/load.cc @@ -1314,6 +1314,16 @@ LangExpr *LoadSource::walkCodeFactor( code_factor codeFactor ) expr = parseCmd( internal, false, objField, typeRef, init, list ); } + else if ( codeFactor.ParseStop() != 0 ) { + /* The type we are parsing. */ + type_ref typeRefTree = codeFactor.TypeRef(); + TypeRef *typeRef = walkTypeRef( typeRefTree ); + ObjectField *objField = walkOptCapture( codeFactor.OptCapture() ); + FieldInitVect *init = walkOptFieldInit( codeFactor.OptFieldInit() ); + ConsItemList *list = walkAccumulate( codeFactor.Accumulate() ); + + expr = parseCmd( internal, true, objField, typeRef, init, list ); + } else if ( codeFactor.Cons() != 0 ) { /* The type we are parsing. */ type_ref typeRefTree = codeFactor.TypeRef(); diff --git a/test/ragelambig1.exp b/test/ragelambig1.exp deleted file mode 100644 index f6b7171f..00000000 --- a/test/ragelambig1.exp +++ /dev/null @@ -1 +0,0 @@ -<start><expression><expression><term><factor_with_rep><factor_with_neg><factor><alphabet_num><uint>1</uint></alphabet_num></factor></factor_with_neg></factor_with_rep></term></expression><_literal_0007>-</_literal_0007><term><factor_with_rep><factor_with_neg><factor><alphabet_num><uint>1</uint></alphabet_num></factor></factor_with_neg></factor_with_rep></term></expression></start> diff --git a/test/ragelambig1.in b/test/ragelambig1.in deleted file mode 100644 index 0b4439e5..00000000 --- a/test/ragelambig1.in +++ /dev/null @@ -1 +0,0 @@ -1 - 1 diff --git a/test/ragelambig1.lm b/test/ragelambig1.lm index c4921192..da263c27 100644 --- a/test/ragelambig1.lm +++ b/test/ragelambig1.lm @@ -1,3 +1,4 @@ +##### LM ##### lex ignore /[\t\n ]+/ literal '^', '|', '-', ',', ':', '!', '?', '.' @@ -65,3 +66,7 @@ def alphabet_num parse start[ stdin ] print( '\n' ) +##### IN ##### +1 - 1 +##### EXP ##### +<start><expression><expression><term><factor_with_rep><factor_with_neg><factor><alphabet_num><uint>1</uint></alphabet_num></factor></factor_with_neg></factor_with_rep></term></expression><_literal_0007>-</_literal_0007><term><factor_with_rep><factor_with_neg><factor><alphabet_num><uint>1</uint></alphabet_num></factor></factor_with_neg></factor_with_rep></term></expression></start> diff --git a/test/ragelambig2.exp b/test/ragelambig2.exp deleted file mode 100644 index 126719e4..00000000 --- a/test/ragelambig2.exp +++ /dev/null @@ -1 +0,0 @@ -<start><expression><expression><term><factor_with_rep><factor_with_neg><factor><alphabet_num><uint>1</uint></alphabet_num></factor></factor_with_neg></factor_with_rep><more_term></more_term></term></expression><_literal_0007>-</_literal_0007><term><factor_with_rep><factor_with_neg><factor><alphabet_num><uint>1</uint></alphabet_num></factor></factor_with_neg></factor_with_rep><more_term></more_term></term></expression></start> diff --git a/test/ragelambig2.in b/test/ragelambig2.in deleted file mode 100644 index 0b4439e5..00000000 --- a/test/ragelambig2.in +++ /dev/null @@ -1 +0,0 @@ -1 - 1 diff --git a/test/ragelambig2.lm b/test/ragelambig2.lm index 67e84503..74ce32ff 100644 --- a/test/ragelambig2.lm +++ b/test/ragelambig2.lm @@ -1,3 +1,4 @@ +##### LM ##### lex ignore /[\t\n ]+/ literal '^', '|', '-', ',', ':', '!', '?', '.' @@ -65,3 +66,7 @@ def alphabet_num parse start[ stdin ] print( '\n' ) +##### IN ##### +1 - 1 +##### EXP ##### +<start><expression><expression><term><factor_with_rep><factor_with_neg><factor><alphabet_num><uint>1</uint></alphabet_num></factor></factor_with_neg></factor_with_rep><more_term></more_term></term></expression><_literal_0007>-</_literal_0007><term><factor_with_rep><factor_with_neg><factor><alphabet_num><uint>1</uint></alphabet_num></factor></factor_with_neg></factor_with_rep><more_term></more_term></term></expression></start> diff --git a/test/rediv.exp b/test/rediv.exp deleted file mode 100644 index e684c38b..00000000 --- a/test/rediv.exp +++ /dev/null @@ -1,4 +0,0 @@ -g -y -a -<start><_repeat_statement><statement><expr><term><term><factor><number>2</number></factor></term><_literal_0021>/</_literal_0021><factor><_literal_0021>/</_literal_0021><regex_body><_repeat_regex_item><regex_item><regex_base><orlit_neg_open>[^</orlit_neg_open><orlit><_repeat_orlit_item><orlit_item><orlit_chr>g</orlit_chr></orlit_item><orlit_item><orlit_chr>u</orlit_chr><orlit_dash>-</orlit_dash><orlit_chr>z</orlit_chr></orlit_item><orlit_item><orlit_chr>y</orlit_chr></orlit_item></_repeat_orlit_item></orlit><orlit_close>]</orlit_close></regex_base><regex_rep></regex_rep></regex_item><regex_item><regex_base><regex_dot>.</regex_dot></regex_base><regex_rep><regex_star>*</regex_star></regex_rep></regex_item><regex_item><regex_base><regex_chr>o</regex_chr></regex_base><regex_rep></regex_rep></regex_item><regex_item><regex_base><orlit_open>[</orlit_open><orlit><_repeat_orlit_item><orlit_item><orlit_chr>\d</orlit_chr><orlit_dash>-</orlit_dash><orlit_chr>x</orlit_chr></orlit_item><orlit_item><orlit_chr>a</orlit_chr></orlit_item></_repeat_orlit_item></orlit><orlit_close>]</orlit_close></regex_base><regex_rep><regex_star>*</regex_star></regex_rep></regex_item></_repeat_regex_item></regex_body><regex_close>/</regex_close></factor></term></expr><_literal_001f>;</_literal_001f></statement></_repeat_statement></start> diff --git a/test/rediv.in b/test/rediv.in deleted file mode 100644 index f1ef2a38..00000000 --- a/test/rediv.in +++ /dev/null @@ -1 +0,0 @@ -2 / /[^gu-zy].*o[\d-xa]*/; diff --git a/test/rediv.lm b/test/rediv.lm index d22d66cf..8a0a139c 100644 --- a/test/rediv.lm +++ b/test/rediv.lm @@ -1,3 +1,4 @@ +##### LM ##### # Or-literal scanner lex token orlit_dash /'-' / @@ -91,3 +92,10 @@ for I:orlit_item in S { } print_xml( S ) print( '\n' ) +##### IN ##### +2 / /[^gu-zy].*o[\d-xa]*/; +##### EXP ##### +g +y +a +<start><_repeat_statement><statement><expr><term><term><factor><number>2</number></factor></term><_literal_0021>/</_literal_0021><factor><_literal_0021>/</_literal_0021><regex_body><_repeat_regex_item><regex_item><regex_base><orlit_neg_open>[^</orlit_neg_open><orlit><_repeat_orlit_item><orlit_item><orlit_chr>g</orlit_chr></orlit_item><orlit_item><orlit_chr>u</orlit_chr><orlit_dash>-</orlit_dash><orlit_chr>z</orlit_chr></orlit_item><orlit_item><orlit_chr>y</orlit_chr></orlit_item></_repeat_orlit_item></orlit><orlit_close>]</orlit_close></regex_base><regex_rep></regex_rep></regex_item><regex_item><regex_base><regex_dot>.</regex_dot></regex_base><regex_rep><regex_star>*</regex_star></regex_rep></regex_item><regex_item><regex_base><regex_chr>o</regex_chr></regex_base><regex_rep></regex_rep></regex_item><regex_item><regex_base><orlit_open>[</orlit_open><orlit><_repeat_orlit_item><orlit_item><orlit_chr>\d</orlit_chr><orlit_dash>-</orlit_dash><orlit_chr>x</orlit_chr></orlit_item><orlit_item><orlit_chr>a</orlit_chr></orlit_item></_repeat_orlit_item></orlit><orlit_close>]</orlit_close></regex_base><regex_rep><regex_star>*</regex_star></regex_rep></regex_item></_repeat_regex_item></regex_body><regex_close>/</regex_close></factor></term></expr><_literal_001f>;</_literal_001f></statement></_repeat_statement></start> diff --git a/test/reparse.exp b/test/reparse.exp deleted file mode 100644 index 678337aa..00000000 --- a/test/reparse.exp +++ /dev/null @@ -1 +0,0 @@ -a b c ( chocolate fudge ) d e diff --git a/test/reparse.in b/test/reparse.in deleted file mode 100644 index 678337aa..00000000 --- a/test/reparse.in +++ /dev/null @@ -1 +0,0 @@ -a b c ( chocolate fudge ) d e diff --git a/test/reparse.lm b/test/reparse.lm index 317d5c01..32ed191e 100644 --- a/test/reparse.lm +++ b/test/reparse.lm @@ -1,3 +1,4 @@ +##### LM ##### lex ignore /space+/ literal '*', '(', ')' @@ -19,3 +20,7 @@ parse Again: start[ %Input.tree ] print( %Again.tree ) +##### IN ##### +a b c ( chocolate fudge ) d e +##### EXP ##### +a b c ( chocolate fudge ) d e diff --git a/test/rhsref1.exp b/test/rhsref1.exp deleted file mode 100644 index 4a702d1f..00000000 --- a/test/rhsref1.exp +++ /dev/null @@ -1,6 +0,0 @@ -1 -1 -d -10 -a -there diff --git a/test/rhsref1.in b/test/rhsref1.in deleted file mode 100644 index 19b7bb19..00000000 --- a/test/rhsref1.in +++ /dev/null @@ -1,14 +0,0 @@ - -var a; -a := 1; - -head: - -a := a + 1; -c := d; - -if a = 10 then - goto head; -end - -hi := there; diff --git a/test/rhsref1.lm b/test/rhsref1.lm index ff7d0e4d..445116be 100644 --- a/test/rhsref1.lm +++ b/test/rhsref1.lm @@ -1,3 +1,4 @@ +##### LM ##### lex literal 'var', 'if', 'then', 'else', 'while', 'do', 'for', 'read', 'write', 'end', 'to', 'goto' @@ -93,3 +94,25 @@ for E: expression in P { print( ^(E.Term.Factor.Primary) '\n' ) } +##### IN ##### + +var a; +a := 1; + +head: + +a := a + 1; +c := d; + +if a = 10 then + goto head; +end + +hi := there; +##### EXP ##### +1 +1 +d +10 +a +there diff --git a/test/rubyhere.exp b/test/rubyhere.exp deleted file mode 100644 index 04bf79fd..00000000 --- a/test/rubyhere.exp +++ /dev/null @@ -1,9 +0,0 @@ -<rubyhere::start><rubyhere::_repeat_item><rubyhere::item><rubyhere::statement><rubyhere::call><rubyhere::id>print</rubyhere::id><rubyhere::_literal_000d>(</rubyhere::_literal_000d><rubyhere::_opt_arglist><rubyhere::arglist><rubyhere::primary><rubyhere::heredoc><rubyhere::_literal_0007><<</rubyhere::_literal_0007><rubyhere::here_id>DATA1</rubyhere::here_id></rubyhere::heredoc></rubyhere::primary><rubyhere::_repeat_arglist_more><rubyhere::arglist_more><rubyhere::_literal_000b>,</rubyhere::_literal_000b><rubyhere::primary><rubyhere::id>more</rubyhere::id></rubyhere::primary></rubyhere::arglist_more><rubyhere::arglist_more><rubyhere::_literal_000b>,</rubyhere::_literal_000b><rubyhere::primary><rubyhere::heredoc><rubyhere::_literal_0007><<</rubyhere::_literal_0007><rubyhere::here_id>DATA2</rubyhere::here_id></rubyhere::heredoc></rubyhere::primary></rubyhere::arglist_more><rubyhere::arglist_more><rubyhere::_literal_000b>,</rubyhere::_literal_000b><rubyhere::primary><rubyhere::number>99</rubyhere::number></rubyhere::primary></rubyhere::arglist_more></rubyhere::_repeat_arglist_more></rubyhere::arglist></rubyhere::_opt_arglist><rubyhere::_literal_000f>)</rubyhere::_literal_000f></rubyhere::call></rubyhere::statement><rubyhere::_literal_0011>!</rubyhere::_literal_0011></rubyhere::item><rubyhere::item><rubyhere::foobar>print( <<DATA1, more, <<DATA2, 99 ) -"&^#(@ almost -!arbitrary text! -DATA1 -hello -world -DATA2 -# error here -</rubyhere::foobar></rubyhere::item></rubyhere::_repeat_item></rubyhere::start> diff --git a/test/rubyhere.in b/test/rubyhere.in deleted file mode 100644 index 0ce5becb..00000000 --- a/test/rubyhere.in +++ /dev/null @@ -1,16 +0,0 @@ -print( <<DATA1, more, <<DATA2, 99 ) -"&^#(@ almost -!arbitrary text! -DATA1 -hello -world -DATA2 -! -print( <<DATA1, more, <<DATA2, 99 ) -"&^#(@ almost -!arbitrary text! -DATA1 -hello -world -DATA2 -# error here diff --git a/test/rubyhere.lm b/test/rubyhere.lm index 7a23eedb..1ead1f6e 100644 --- a/test/rubyhere.lm +++ b/test/rubyhere.lm @@ -1,3 +1,4 @@ +##### LM ##### context rubyhere rl ident_pattern /[a-zA-Z_][a-zA-Z_0-9]*/ rl number_pattern /[0-9]+/ @@ -94,3 +95,30 @@ S: rubyhere::start = SP.tree print_xml(S) print('\n') +##### IN ##### +print( <<DATA1, more, <<DATA2, 99 ) +"&^#(@ almost +!arbitrary text! +DATA1 +hello +world +DATA2 +! +print( <<DATA1, more, <<DATA2, 99 ) +"&^#(@ almost +!arbitrary text! +DATA1 +hello +world +DATA2 +# error here +##### EXP ##### +<rubyhere::start><rubyhere::_repeat_item><rubyhere::item><rubyhere::statement><rubyhere::call><rubyhere::id>print</rubyhere::id><rubyhere::_literal_000d>(</rubyhere::_literal_000d><rubyhere::_opt_arglist><rubyhere::arglist><rubyhere::primary><rubyhere::heredoc><rubyhere::_literal_0007><<</rubyhere::_literal_0007><rubyhere::here_id>DATA1</rubyhere::here_id></rubyhere::heredoc></rubyhere::primary><rubyhere::_repeat_arglist_more><rubyhere::arglist_more><rubyhere::_literal_000b>,</rubyhere::_literal_000b><rubyhere::primary><rubyhere::id>more</rubyhere::id></rubyhere::primary></rubyhere::arglist_more><rubyhere::arglist_more><rubyhere::_literal_000b>,</rubyhere::_literal_000b><rubyhere::primary><rubyhere::heredoc><rubyhere::_literal_0007><<</rubyhere::_literal_0007><rubyhere::here_id>DATA2</rubyhere::here_id></rubyhere::heredoc></rubyhere::primary></rubyhere::arglist_more><rubyhere::arglist_more><rubyhere::_literal_000b>,</rubyhere::_literal_000b><rubyhere::primary><rubyhere::number>99</rubyhere::number></rubyhere::primary></rubyhere::arglist_more></rubyhere::_repeat_arglist_more></rubyhere::arglist></rubyhere::_opt_arglist><rubyhere::_literal_000f>)</rubyhere::_literal_000f></rubyhere::call></rubyhere::statement><rubyhere::_literal_0011>!</rubyhere::_literal_0011></rubyhere::item><rubyhere::item><rubyhere::foobar>print( <<DATA1, more, <<DATA2, 99 ) +"&^#(@ almost +!arbitrary text! +DATA1 +hello +world +DATA2 +# error here +</rubyhere::foobar></rubyhere::item></rubyhere::_repeat_item></rubyhere::start> |