blob: 79c19578bd148eaf6baf899afdd784323ab5b059 (
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
module ec;
import system;
const
S_char = 0;
S_module = 1;
var
col : integer;
row : integer;
look : char;
sym : integer;
procedure Err0( s : array of char );
begin
system.writestring( "Error line " );
system.writeinteger( row );
system.writestring( ", pos " );
system.writeinteger( col );
system.writestring( ": " );
system.writeline( s );
end
(* TODO: segfault when defining parameter *)
procedure Err1N( s : array of char, n : integer );
begin
system.writestring( "Error line " );
system.writeinteger( row );
system.writestring( ", pos " );
system.writeinteger( col );
system.writestring( ": " );
system.writestring( s );
system.writestring( " " );
system.writeinteger( n );
end
procedure Halt;
begin
system.halt( 1 )
end
procedure Abort0( s : array of char );
begin
Err0( s );
Halt;
end
procedure Abort1N( s : array of char, n : integer );
begin
Err1N( s, n );
Halt;
end
(* scanner *)
procedure getChar : char;
var
c : char;
begin
c := system.readchar( );
if ( c = char( 0 ) ) do
return c;
end;
col := col + 1;
if ( c = char( 10 ) ) do
col := 1;
row := row + 1;
end;
return c;
end
procedure isWhite( c : char ) : boolean;
begin
if ( c = char( 0 ) ) or ( c = char( 10 ) ) or ( c = char( 13 ) ) or ( c = char( 9 ) ) do
return true
else
return false
end
end
procedure skipWhite;
begin
while ( isWhite( look ) ) do
look := getChar( );
end
end
procedure getSym : integer;
begin
skipWhite;
return S_char;
end
(* parser *)
procedure Expect( expect : integer );
begin
if ( sym = expect ) do
sym := getSym( );
else
(* TODO: symtable names
Abort( "Expected symbol", symname[expect] );
*)
Abort0( "Expected symbol" );
end
end
procedure init;
begin
col := 1;
row := 1;
look := getChar( );
sym := getSym( );
end
procedure prologue;
begin
system.writeline( "[bits 32]" );
system.writeline( "cpu 486" );
system.writeline( "org 0x1000000" );
end
procedure doModule;
begin
Expect( S_module );
(*
look := getChar( );
while ( look <> char( 0 ) ) do
if not isWhite( look ) do
system.writechar( look );
end;
look := getChar( );
end;
*)
end
procedure epilogue;
begin
system.writeline( "hlt" );
end
begin
prologue;
init;
doModule;
epilogue;
system.halt( 0 );
end
|