summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2013-03-23 13:38:07 -0400
committerAdrian Thurston <thurston@complang.org>2013-03-23 13:38:07 -0400
commit9922542d39edd209212541baeac8cfc7def13a83 (patch)
treed0da0e22bddb2fc877961a2fafbed6209d605d7b
parent69153ffd853c41064a85f7331e114501d7d4c434 (diff)
downloadcolm-9922542d39edd209212541baeac8cfc7def13a83.tar.gz
added parse_stop
-rw-r--r--colm/colm.lm3
-rw-r--r--colm/load.cc10
-rw-r--r--test/ragelambig1.exp1
-rw-r--r--test/ragelambig1.in1
-rw-r--r--test/ragelambig1.lm5
-rw-r--r--test/ragelambig2.exp1
-rw-r--r--test/ragelambig2.in1
-rw-r--r--test/ragelambig2.lm5
-rw-r--r--test/rediv.exp4
-rw-r--r--test/rediv.in1
-rw-r--r--test/rediv.lm8
-rw-r--r--test/reparse.exp1
-rw-r--r--test/reparse.in1
-rw-r--r--test/reparse.lm5
-rw-r--r--test/rhsref1.exp6
-rw-r--r--test/rhsref1.in14
-rw-r--r--test/rhsref1.lm23
-rw-r--r--test/rubyhere.exp9
-rw-r--r--test/rubyhere.in16
-rw-r--r--test/rubyhere.lm28
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>&lt;&lt;</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>&lt;&lt;</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( &lt;&lt;DATA1, more, &lt;&lt;DATA2, 99 )
-"&amp;^#(@ 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>&lt;&lt;</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>&lt;&lt;</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( &lt;&lt;DATA1, more, &lt;&lt;DATA2, 99 )
+"&amp;^#(@ almost
+!arbitrary text!
+DATA1
+hello
+world
+DATA2
+# error here
+</rubyhere::foobar></rubyhere::item></rubyhere::_repeat_item></rubyhere::start>