summaryrefslogtreecommitdiff
path: root/test/rhsref1.lm
diff options
context:
space:
mode:
Diffstat (limited to 'test/rhsref1.lm')
-rw-r--r--test/rhsref1.lm117
1 files changed, 117 insertions, 0 deletions
diff --git a/test/rhsref1.lm b/test/rhsref1.lm
new file mode 100644
index 0000000..c905d2a
--- /dev/null
+++ b/test/rhsref1.lm
@@ -0,0 +1,117 @@
+##### LM #####
+lex
+ literal `var `if `then `else `while `do `for `read `write
+ `end `to `goto
+ literal `:= `!= `; `+ `- `* `/ `= `( `) `:
+
+ ignore /'//' [^\n]* '\n'/
+ ignore /[\n\t ]+/
+ token id /[a-zA-Z_]+/
+ token integernumber /[0-9]+/
+ token stringlit /'"' [^"]* '"'/
+end
+
+def program
+ [statement*]
+
+def statement
+ [declaration]
+| [assignment_statement]
+| [if_statement]
+| [while_statement]
+| [do_statement]
+| [for_statement]
+| [read_statement]
+| [write_statement]
+| [labelled_statement]
+| [goto_statement]
+
+def declaration
+ [`var id `;]
+
+def assignment_statement
+ [id `:= expression `;]
+
+def if_statement
+ [`if expression `then statement* opt_else_statement `end]
+
+def opt_else_statement
+ [`else statement*]
+| []
+
+def while_statement
+ [`while expression `do statement* `end]
+
+def do_statement
+ [`do statement* `while expression `;]
+
+def for_statement
+ [`for id `:= expression `to expression `do statement* `end]
+
+def read_statement
+ [`read id `;]
+
+def write_statement
+ [`write expression `;]
+
+def expression
+ [Term: term]
+| [expression eqop Term: term]
+
+def eqop [`=] | [`!=]
+
+def term
+ [Factor: factor]
+| [term addop Factor: factor]
+
+def addop [`+] | [`-]
+
+def factor
+ [Primary: primary]
+| [factor mulop Primary: primary]
+
+def mulop [`*] | [`/]
+
+def primary
+ [id]
+| [lit]
+| [`( expression `)]
+
+def lit
+ [integernumber]
+| [stringlit]
+
+def labelled_statement
+ [id `: statement]
+
+def goto_statement
+ [`goto id `;]
+
+parse P: program[stdin]
+
+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