blob: 3271216aa473b4b0264908286ede732a85c2f2ff (
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
|
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 integer /[0-9]+/
token stringlit /'"' [^"]* '"'/
token insert_semi /
( ( id -
'var' - 'if' - 'then' - 'else' - 'while' -
'do' - 'for' - 'read' - 'write' - 'end' -
'to' - 'goto' ) |
integer | stringlit | ')' ) '\n' /
{
Prefix: str = input->pull( match_length - 1 )
input->push( ";" )
input->push( Prefix )
}
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]
| [expression eqop term]
def eqop [`=] | [`!=]
def term
[factor]
| [term addop factor]
def addop [`+] | [`-]
def factor
[primary]
| [factor mulop primary]
def mulop [`*] | [`/]
def primary
[id]
| [lit]
| [`( expression `)]
def lit
[integer]
| [stringlit]
def labelled_statement
[id `: statement]
def goto_statement
[`goto id `;]
parse P: program[stdin]
if P
print[ P ]
else {
print "[error]
exit( 1 )
}
|