Browse Source

First draft

Arnaud Vergnet 3 years ago
parent
commit
6e00634d28
4 changed files with 195 additions and 0 deletions
  1. 19
    0
      Makefile
  2. 54
    0
      al.lex
  3. 115
    0
      as.y
  4. 7
    0
      test.c

+ 19
- 0
Makefile View File

@@ -0,0 +1,19 @@
1
+LEX = flex
2
+YACC = bison -d
3
+CC = gcc
4
+
5
+compilateur: as.tab.c lex.yy.c
6
+	$(CC) -o compilateur as.tab.c lex.yy.c
7
+
8
+as.tab.c: as.y
9
+	$(YACC) as.y
10
+
11
+
12
+lex.yy.c: al.lex
13
+	$(LEX) al.lex
14
+
15
+
16
+build: compilateur
17
+
18
+clean:
19
+	rm as.tab.c as.tab.h lex.yy.c compilateur

+ 54
- 0
al.lex View File

@@ -0,0 +1,54 @@
1
+%{
2
+#include "as.tab.h"
3
+%}
4
+
5
+D           [0-9]
6
+
7
+%%
8
+
9
+{D}+(e{D}+)?	{ 
10
+                yylval.nombre = atoi(yytext);
11
+                return tNB;
12
+            }
13
+
14
+"+"			{ return tADD; }
15
+"-"			{ return tSUB; }
16
+"*"			{ return tMUL; }
17
+"/"			{ return tDIV; }
18
+"="			{ return tEQ; }
19
+"("			{ return tPO; }
20
+")"			{ return tPF; }
21
+";"			{ return tPV; }
22
+","			{ return tVIRG; }
23
+"{"			{ return tAO; }
24
+"}"			{ return tAF; }
25
+"!"		{ return tNOT; }
26
+"=="		{ return tEQ2; }
27
+"!="		{ return tNOTEQ; }
28
+"<"			{ return tINF; }
29
+"<="		{ return tINFEQ; }
30
+">"			{ return tSUP; }
31
+">="		{ return tSUPEQ; }
32
+"&&"		{ return tAND; }
33
+"||"		{ return tOR; }
34
+[ \t\n]+	{ }
35
+
36
+"int"		{ return tINT; }
37
+"const"		{ return tCONST; }
38
+"main"		{ return tMAIN; }
39
+"if"		{ return tIF; }
40
+"else"		{ return tELSE; }
41
+"elsif"		{ return tELSIF; }
42
+"while"		{ return tWHILE; }
43
+"printf"	{ return tPRINTF; }
44
+[a-zA-Z][a-zA-Z0-9_]*		{ return tID; }
45
+
46
+%%
47
+
48
+int yywrap() {
49
+	return 1;
50
+}
51
+// int main () {
52
+// 	yylex();
53
+// 	return 1;
54
+// } 

+ 115
- 0
as.y View File

@@ -0,0 +1,115 @@
1
+%{
2
+#include "stdio.h"
3
+#include "stdlib.h"
4
+%}
5
+
6
+%union {
7
+	int nombre;
8
+}
9
+
10
+%token<nombre> tNB
11
+%token tADD
12
+%token tSUB
13
+%token tMUL
14
+%token tDIV
15
+%token tPO
16
+%token tPF
17
+%token tPV
18
+%token tVIRG
19
+%token tAO
20
+%token tAF
21
+%token tEQ
22
+%token tEQ2
23
+%token tNOTEQ
24
+%token tNOT
25
+%token tINF
26
+%token tINFEQ
27
+%token tSUP
28
+%token tSUPEQ
29
+%token tAND
30
+%token tOR
31
+
32
+%token tINT
33
+%token tCONST
34
+%token tMAIN
35
+%token tIF
36
+%token tELSE
37
+%token tELSIF
38
+%token tWHILE
39
+%token tPRINTF
40
+%token tID
41
+
42
+%left tADD
43
+%left tSUB
44
+%left tMUL
45
+%left tDIV
46
+// %type<nombre> E
47
+
48
+%%
49
+
50
+S : Main ;
51
+
52
+Main : tINT tMAIN tPO Params tPF Body ;
53
+
54
+Params : | Param SuiteParams ;
55
+Param : tINT tID ;
56
+
57
+SuiteParams : tVIRG Param SuiteParams ;
58
+
59
+Body : tAO Instructions tAF ;
60
+
61
+Instructions : Instruction Instructions | ;
62
+
63
+Instruction : Aff | Printf  | If ;
64
+
65
+Aff : tID tEQ E tPV ;
66
+
67
+E : tNB | tID | E tADD E | E tMUL E | E tSUB E | E tDIV E | tPO E tPF | tSUB E ;
68
+
69
+
70
+If : IfSimple | IfElse ;
71
+
72
+IfSimple : tIF tPO Cond tPF Body ;
73
+
74
+IfElse : IfSimple tELSE Body  ;
75
+
76
+Cond : Cond tAND Cond | Cond tOR Cond | E tEQ2 E | E tINF E | E tINFEQ E | E tSUP E | E tSUPEQ E | E tNOTEQ E | tNOT Cond | tNOT tPO Cond tPF ;
77
+
78
+Printf : tPRINTF tPO tID tPF tPV
79
+
80
+// If : tIF tPO Cond tPF Body ;
81
+// 
82
+// Cond : Cond tAND Cond | Cond tOR Cond | E tEQ2 E | E tINF E | tNOT Cond ;
83
+
84
+// Invocation : tID tPO  Args  tPF ;
85
+
86
+// Args : .... cf params
87
+
88
+// Return : tRET E tPV ;
89
+
90
+
91
+/* S -> E ; S
92
+ * S ->
93
+ */
94
+// S : E tPV
95
+// 						{ printf("RES: %d\n", $1); }
96
+// 		S
97
+// 	|					{ printf("END\n"); }
98
+// 	;
99
+// 
100
+// E : E tADD E	{ $$ = $1 + $3; }
101
+// 	| E tSUB E	{ $$ = $1 - $3; }
102
+// 	| tOB E tCB	{ $$ = $2; }
103
+// 	| tNB				{ $$ = $1; }
104
+// 	;
105
+
106
+%%
107
+
108
+void yyerror(char const* err) {
109
+    printf("%s\n", err);
110
+    exit(1);
111
+}
112
+
113
+void main(void) {
114
+	yyparse();
115
+}

+ 7
- 0
test.c View File

@@ -0,0 +1,7 @@
1
+int main(){
2
+    x = 3 + 6;
3
+    printf(x);
4
+    if (x == x && y != 5 + 6 || 1 + 2 == 2 + 1 && !(x == x)) {
5
+        printf(x);
6
+    }
7
+}

Loading…
Cancel
Save