Skip to content

Commit a250143

Browse files
committed
add final source
1 parent efc3e88 commit a250143

File tree

8 files changed

+991
-0
lines changed

8 files changed

+991
-0
lines changed

src/CFG.c

+307
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,307 @@
1+
/*
2+
Jadi yang dibutuhkan scannernya adalah mengubah input :
3+
4+
begin -> b
5+
end -> e
6+
if -> i
7+
then -> h
8+
else -> l
9+
do -> d
10+
while -> w
11+
to -> t
12+
operator logika (<, >, <>, <=, >=) -> x
13+
operator aritmatika (+, -, *) -> a
14+
sama dengan (=) -> = (sama dengan juga)
15+
input -> n
16+
output -> o
17+
variabel -> v
18+
constanta -> c
19+
kurung buka ( -> ( (tetap)
20+
kurung tutup ) -> ) (tetap)
21+
22+
23+
Jangan lupa tambahkan kesalahan ada pada line berapa..
24+
ini tidak tahu ada di line berapa sekarang,
25+
kecuali jika NEWLINE diubah menjadi TERMINAL juga, misalkan N
26+
27+
KOMENTAR saat scan di IGNORE saja, ini tidak dapat memproses komentar
28+
29+
*/
30+
31+
#include "stack.h"
32+
#include "scanner.h"
33+
34+
/*Kamus*/
35+
ArrToken X;
36+
37+
Stack S;
38+
char D[30][12];
39+
char A;
40+
int baris;
41+
boolean sukses;
42+
43+
44+
45+
void InputMatrixStack()
46+
{
47+
int i,j;
48+
49+
for (i=0;i<=25;i++)
50+
{
51+
for(j=0;j<=11;j++)
52+
{
53+
D[i][j]='|';
54+
}
55+
}
56+
57+
D[1][1] = 'e'; D[1][2] = 'B'; D[1][3] = 'b';
58+
D[2][1] = 'e'; D[2][2] = 'B';
59+
D[3][1] = 'I';
60+
D[4][1] = 'D';
61+
D[5][1] = 'F';
62+
D[6][1] = 'M';
63+
D[7][1] = 'K';
64+
D[8][1] = 'H'; D[8][2] = 'E'; D[8][3] = 'v';
65+
D[9][1] = 'S'; D[9][2] = 'h'; D[9][3] = 'P'; D[9][4] = 'i';
66+
D[10][1] = 'S'; D[10][2] = 'l';
67+
D[10][1] = 'B'; D[11][2] = 'P'; D[11][3] = 'w'; D[11][4] = '~'; D[11][5] = 'B'; D[11][6] = 'd';
68+
D[12][1] = 'S'; D[12][2] = 'd'; D[12][3] = ')'; D[12][4] = 'c'; D[12][5] = 't'; D[12][6] = 'c'; D[12][7] = 'E'; D[12][8] = 'v'; D[12][9] = '('; D[12][10] = 'f';
69+
D[13][1] = ')'; D[13][2] = '_'; D[13][3] = 'L'; D[13][4] = '_'; D[13][5] = '(';
70+
D[14][1] = 'c';
71+
D[15][1] = 'v';
72+
D[16][1] = 'x';
73+
D[17][1] = 'E';
74+
D[18][1] = '_'; D[18][2] = 'a'; D[18][3] = '_';
75+
D[19][1] = ')'; D[19][2] = 'v'; D[19][3] = '('; D[19][4] = 'n';
76+
D[20][1] = ')'; D[20][2] = 'v'; D[20][3] = '('; D[20][4] = 'o';
77+
D[21][1] = ')'; D[21][2] = 'H'; D[21][3] = '('; D[21][4] = 'o';
78+
D[22][1] = '=';
79+
}
80+
81+
void Pushing(int i)
82+
{
83+
int j = 1;
84+
85+
while (D[i][j]!='|')
86+
{
87+
Push(&S,D[i][j]);
88+
j = j + 1;
89+
}
90+
}
91+
92+
93+
94+
int main()
95+
{
96+
int i;
97+
InputMatrixStack();
98+
InitialToken();
99+
100+
scanner();
101+
printf("Scan Success\n");
102+
sukses=true;
103+
i=0;
104+
//CreateEmpty(&S);
105+
Push(&S,'Z');
106+
Push(&S,'S');
107+
/*while (X.Tab[i]!='|')
108+
{
109+
printf("%c\n",X.Tab[i]);
110+
i++;
111+
}
112+
*/
113+
while ((X.Tab[i]!='|')&&(sukses==true))
114+
{
115+
printf("%c\n", X.Tab[i]);
116+
//printf("%c\n", InfoTop(S));
117+
if (InfoTop(S)=='S')
118+
{
119+
Pop(&S,&A);
120+
if (X.Tab[i+1]=='e')
121+
{
122+
Pushing(2);
123+
}
124+
else
125+
{
126+
Pushing(1);
127+
}
128+
}
129+
else if (InfoTop(S)=='B')
130+
{
131+
if (X.Tab[i]=='i')
132+
{
133+
Pushing(3);
134+
}
135+
else if (X.Tab[i]=='d')
136+
{
137+
Pop(&S,&A);
138+
Pushing(4);
139+
}
140+
else if (X.Tab[i]=='f')
141+
{
142+
Pushing(5);
143+
}
144+
else if (X.Tab[i]=='n')
145+
{
146+
Pushing(6);
147+
}
148+
else if (X.Tab[i]=='o')
149+
{
150+
Pushing(7);
151+
}
152+
else if (X.Tab[i]=='v')
153+
{
154+
Pushing(8);
155+
}
156+
else if ((X.Tab[i]=='e')||(X.Tab[i]=='w'))
157+
{
158+
Pop(&S,&A);
159+
if (X.Tab[i]=='w')
160+
{
161+
Pop(&S,&A);
162+
Push(&S,'B');
163+
if (A!='~')
164+
{
165+
sukses=false;
166+
}
167+
}
168+
}
169+
}
170+
else if (InfoTop(S)=='I')
171+
{
172+
Pop(&S,&A);
173+
Push(&S,'+');
174+
Pushing(9);
175+
}
176+
else if (InfoTop(S)=='+')
177+
{
178+
Pop(&S,&A);
179+
if (X.Tab[i]=='l')
180+
{
181+
Pushing(10);
182+
}
183+
}
184+
else if (InfoTop(S)=='D')
185+
{
186+
Pop(&S,&A);
187+
Pushing(11);
188+
}
189+
else if (InfoTop(S)=='F')
190+
{
191+
Pop(&S,&A);
192+
Pushing(12);
193+
}
194+
else if (InfoTop(S)=='P')
195+
{
196+
Pop(&S,&A);
197+
Pushing(13);
198+
}
199+
else if (InfoTop(S)=='_')
200+
{
201+
Pop(&S,&A);
202+
if (X.Tab[i]=='c')
203+
{
204+
Pushing(14);
205+
}
206+
else if (X.Tab[i]=='v')
207+
{
208+
Pushing(15);
209+
}
210+
}
211+
else if (InfoTop(S)=='L')
212+
{
213+
Pop(&S,&A);
214+
if(X.Tab[i]=='x')
215+
{
216+
Pushing(16);
217+
}
218+
else
219+
{
220+
Pushing(17);
221+
}
222+
}
223+
else if (InfoTop(S)=='H')
224+
{
225+
Pop(&S,&A);
226+
Pushing(18);
227+
}
228+
else if (InfoTop(S)=='M')
229+
{
230+
Pop(&S,&A);
231+
Pushing(19);
232+
}
233+
else if (InfoTop(S)=='K')
234+
{
235+
Pop(&S,&A);
236+
if (X.Tab[i+3]==')')
237+
{
238+
Pushing(20);
239+
}
240+
else
241+
{
242+
Pushing(21);
243+
}
244+
}
245+
else if (InfoTop(S)=='E')
246+
{
247+
Pop(&S,&A);
248+
Pushing(22);
249+
}
250+
else if(InfoTop(S)==X.Tab[i])
251+
{
252+
Pop(&S,&A);
253+
i=i+1;
254+
}
255+
else
256+
{
257+
sukses = false;
258+
}
259+
260+
if (A=='Z')
261+
{
262+
sukses = false;
263+
}
264+
265+
266+
}
267+
268+
if ((sukses == true)&&(!IsEmpty(S)))
269+
{
270+
Pop(&S,&A);
271+
if (A=='Z')
272+
{
273+
printf("Compile success\n");
274+
}
275+
else
276+
{
277+
printf("Compile failed\n");
278+
if (i>0)
279+
{
280+
printf("Expected end of file at line - %d\n", X.baris[i-1]);
281+
}
282+
else
283+
{
284+
printf("Expected end of file at line - %d\n", X.baris[0]);
285+
}
286+
}
287+
}
288+
else
289+
{
290+
printf("Compile failed\n");
291+
if (i>0)
292+
{
293+
printf("Syntax error at line - %d\n", X.baris[i-1]);
294+
}
295+
else
296+
{
297+
printf("Syntax error at line - %d\n", X.baris[0]);
298+
}
299+
}
300+
301+
while(!IsEmpty(S))
302+
{
303+
Pop(&S,&A);
304+
}
305+
306+
return 0;
307+
}

src/boolean.h

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/* file : boolean.h */
2+
#ifndef boolean_h
3+
#define boolean_h
4+
5+
#define true 1
6+
#define false 0
7+
#define boolean unsigned char
8+
#endif

src/mesinkarakter.c

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#include "mesinkarakter.h"
2+
3+
//definisi states
4+
char CC;
5+
boolean EOP;
6+
7+
static FILE *pita;
8+
static int retval;
9+
10+
void START()
11+
/* I.S. sembarang
12+
F.S. CC adalah karakter pertama pita (stdin)
13+
Bila Kondisi EOP terpenuhi, nyalakan EOP
14+
*/
15+
{
16+
pita = fopen("program.txt","r");
17+
if (pita==NULL)
18+
{
19+
fprintf(stderr, "No file\n" );
20+
EOP=true;
21+
}
22+
else
23+
{
24+
ADV();
25+
}
26+
}
27+
28+
void ADV()
29+
/* I.S. CC!=mark
30+
F.S. CC adalah karakter berikutnya yang dapat diakuisisi
31+
contoh untuk pita "IF", bila CC menunjuk 'I', maka CC berikutnya adalah 'F'
32+
Bila Kondisi EOP terpenuhi, nyalakan EOP
33+
*/
34+
{
35+
CC=fgetc(pita);
36+
EOP = (CC==EOF);
37+
if (EOP) {
38+
fclose(pita);
39+
}
40+
}
41+

src/mesinkarakter.h

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#ifndef MESINKAR_H
2+
#define MESINKAR_H
3+
#include "boolean.h"
4+
#include <stdio.h>
5+
#define mark '.'
6+
7+
//definisi states
8+
extern char CC;
9+
extern boolean EOP;
10+
11+
void START();
12+
/* I.S. sembarang
13+
F.S. CC adalah karakter pertama pita (stdin)
14+
Bila Kondisi EOP terpenuhi, nyalakan EOP
15+
*/
16+
17+
void ADV();
18+
/* I.S. CC!=mark
19+
F.S. CC adalah karakter berikutnya yang dapat diakuisisi
20+
contoh untuk pita "IF", bila CC menunjuk 'I', maka CC berikutnya adalah 'F'
21+
Bila Kondisi EOP terpenuhi, nyalakan EOP
22+
*/
23+
#endif
24+

0 commit comments

Comments
 (0)