summaryrefslogtreecommitdiff
path: root/test/rhsref1.lm
blob: c905d2a7fc6b46c049e84fd0f238999b6912c151 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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