summaryrefslogtreecommitdiff
path: root/test/commitbt.lm
diff options
context:
space:
mode:
Diffstat (limited to 'test/commitbt.lm')
-rw-r--r--test/commitbt.lm109
1 files changed, 109 insertions, 0 deletions
diff --git a/test/commitbt.lm b/test/commitbt.lm
new file mode 100644
index 0000000..da78807
--- /dev/null
+++ b/test/commitbt.lm
@@ -0,0 +1,109 @@
+##### LM #####
+# 2010: I'm not sure what the following means.
+
+#
+# Local commit:
+# -clears reparse flags underneath
+# -must be possible to backtrack after
+# Global commit (revertOn)
+# -clears all reparse flags
+# -must be possible to backtrack after
+# Global commit (!revertOn)
+# -clears all reparse flags
+# -clears all 'parsed' reverse code
+# -clears all reverse code
+# -clears all alg structures
+#
+
+# This test shows that a global commit with revertOn correctly does not clear
+# 'parsed' items because it must entertain the possibility of backtracking.
+
+lex
+ ignore /[\t\n ]+/
+ literal `^ `| `- `, `: `! `? `.
+ literal `( `) `{ `} `* `& `+
+
+ literal `-- `:> `:>> `<: `-> `**
+
+ token word /[a-zA-Z_][a-zA-Z0-9_]*/
+ token uint /[0-9]+/
+end
+
+
+def expression [term expression_op*]
+
+def expression_op
+ [`| term]
+| [`& term]
+| [`- term]
+| [`-- term]
+
+def term [factor_rep term_rest]
+
+# This list is done manually to get shortest match.
+def term_rest
+ []
+| [term_op term_rest]
+
+def term_op
+ [factor_rep]
+| [`. factor_rep]
+| [`:> factor_rep]
+| [`:>> factor_rep]
+| [`<: factor_rep]
+
+def factor_rep
+ [factor_neg factor_rep_op*]
+
+def factor_rep_op
+ [`*]
+| [`**]
+| [`?]
+| [`+]
+| [`{ factor_rep_num `}]
+| [`{ `, factor_rep_num `}]
+| [`{ factor_rep_num `, `}]
+| [`{ factor_rep_num `, factor_rep_num `}]
+
+def factor_rep_num [uint]
+
+def factor_neg
+ [`! factor_neg]
+| [`^ factor_neg]
+| [factor]
+
+def factor
+ [alphabet_num]
+| [word]
+| [`( expression `)]
+
+def alphabet_num
+ [uint]
+
+def suint
+ i: int
+ [uint]
+
+def sub
+ [suint* `*]
+
+token item
+ S: sub
+ /[0-9]+/
+ {
+ M: str = input.pull(match_length)
+ parse_stop S: sub[input]
+ input.push( make_token( typeid<item> M S ) )
+ }
+
+def stuff
+ [item* `!]
+| [sub]
+
+parse S: stuff[ stdin ]
+print_xml( S )
+print( '\n' )
+##### IN #####
+1 2 3 * !
+##### EXP #####
+<stuff><_repeat_item><item>1</item></_repeat_item><_literal_000d>!</_literal_000d></stuff>