summaryrefslogtreecommitdiff
path: root/grammar/go/insert-semi.lm
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 )
}