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
|