summaryrefslogtreecommitdiff
path: root/test/travs1.lm
diff options
context:
space:
mode:
Diffstat (limited to 'test/travs1.lm')
-rw-r--r--test/travs1.lm286
1 files changed, 286 insertions, 0 deletions
diff --git a/test/travs1.lm b/test/travs1.lm
new file mode 100644
index 0000000..c2f7171
--- /dev/null
+++ b/test/travs1.lm
@@ -0,0 +1,286 @@
+##### LM #####
+lex
+ ignore /[\t\n ]+/
+ literal `^ `| `- `, `: `! `? `.
+ literal `( `) `{ `} `* `& `+
+
+ literal `-- `:> `:>> `<: `-> `**
+
+ token word /[a-zA-Z_][a-zA-Z0-9_]*/
+ token uint /[0-9]+/
+end
+
+
+def start [expression]
+
+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]
+
+parse S: start[stdin]
+
+#
+# Top-Down, Left-Right
+#
+
+int do_topdown_leftright( T: ref<any> )
+{
+ for C:any in child(T) {
+ yield C
+ do_topdown_leftright( C )
+ }
+}
+
+iter topdown_leftright( T: ref<any> )
+{
+ do_topdown_leftright( T )
+}
+
+#
+# Bottom-Up, Left-Right
+#
+
+int do_bottomup_leftright( T: ref<any> )
+{
+ for C:any in child(T) {
+ do_bottomup_leftright( C )
+ yield C
+ }
+}
+
+iter bottomup_leftright( T: ref<any> )
+{
+ do_bottomup_leftright( T )
+}
+
+
+#
+# Top-Down, Right-Left
+#
+
+int do_topdown_rightleft( T: ref<any> )
+{
+ for C:any in rev_child(T) {
+ yield C
+ do_topdown_rightleft( C )
+ }
+}
+
+iter topdown_rightleft( T: ref<any> )
+{
+ do_topdown_rightleft( T )
+}
+
+#
+# Bottom-Up, Right-Left
+#
+
+int do_bottomup_rightleft( T: ref<any> )
+{
+ for C:any in rev_child(T) {
+ do_bottomup_rightleft( C )
+ yield C
+ }
+}
+
+iter bottomup_rightleft( T: ref<any> )
+{
+ do_bottomup_rightleft( T )
+}
+
+#
+# Testing
+#
+
+print( 'bottomup_leftright\n' )
+for T1: any in bottomup_leftright( S )
+{
+ print( ^T1 '\n' )
+}
+
+print( 'bottomup_rightleft\n' )
+for T2: any in bottomup_rightleft( S )
+{
+ print( ^T2 '\n' )
+}
+
+print( 'topdown_leftright\n' )
+for T3: any in topdown_leftright( S )
+{
+ print( ^T3 '\n' )
+}
+
+print( 'topdown_rightleft\n' )
+for T4: any in topdown_rightleft( S )
+{
+ print( ^T4 '\n' )
+}
+##### IN #####
+1 | 2 3
+##### EXP #####
+bottomup_leftright
+1
+1
+1
+1
+
+1
+
+1
+|
+2
+2
+2
+2
+
+2
+3
+3
+3
+3
+
+3
+3
+
+3
+2 3
+| 2 3
+
+| 2 3
+1 | 2 3
+bottomup_rightleft
+
+
+
+3
+3
+3
+3
+3
+3
+3
+
+2
+2
+2
+2
+2
+2 3
+|
+| 2 3
+| 2 3
+
+
+1
+1
+1
+1
+1
+1
+1 | 2 3
+topdown_leftright
+1 | 2 3
+1
+1
+1
+1
+1
+1
+
+
+| 2 3
+| 2 3
+|
+2 3
+2
+2
+2
+2
+2
+
+3
+3
+3
+3
+3
+3
+3
+
+
+
+topdown_rightleft
+1 | 2 3
+| 2 3
+
+| 2 3
+2 3
+3
+
+3
+3
+
+3
+3
+3
+3
+2
+
+2
+2
+2
+2
+|
+1
+
+1
+
+1
+1
+1
+1