aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--makefile5
-rw-r--r--res/exp.tpc5
-rw-r--r--res/instr.tpc28
-rw-r--r--res/ko_sample.tpc24
-rw-r--r--res/ok_sample.tpc24
-rw-r--r--res/trinome.tpc43
-rw-r--r--src/tpc.lex46
-rw-r--r--src/tpc.y238
8 files changed, 197 insertions, 216 deletions
diff --git a/makefile b/makefile
index 9bcb33a..30c573a 100644
--- a/makefile
+++ b/makefile
@@ -16,7 +16,6 @@ LEX_GEN := tpc.yy
16YACC_GEN := tpc.tab 16YACC_GEN := tpc.tab
17 17
18# OUTPUT 18# OUTPUT
19PARSER_BIN := tparser
20COMPIL_BIN := tcompil 19COMPIL_BIN := tcompil
21COMMIT_LOG := commits.log 20COMMIT_LOG := commits.log
22REPORT_PDF := rapport.pdf 21REPORT_PDF := rapport.pdf
@@ -30,7 +29,7 @@ LFLAGS := -lfl -ly
30IFLAGS += -I$(SRC_DIR) -I$(OUT_DIR) 29IFLAGS += -I$(SRC_DIR) -I$(OUT_DIR)
31 30
32# RULES 31# RULES
33all: clean $(OUT_DIR)/$(PARSER_BIN) 32all: clean $(OUT_DIR)/$(COMPIL_BIN)
34 33
35$(OUT_DIR)/$(LEX_GEN).c: $(SRC_DIR)/$(LEX_SRC) 34$(OUT_DIR)/$(LEX_GEN).c: $(SRC_DIR)/$(LEX_SRC)
36 $(LEX) -o $@ $^ 35 $(LEX) -o $@ $^
@@ -44,7 +43,7 @@ $(OUT_DIR)/$(LEX_GEN).o: $(OUT_DIR)/$(LEX_GEN).c $(OUT_DIR)/$(YACC_GEN).h
44$(OUT_DIR)/$(YACC_GEN).o: $(OUT_DIR)/$(YACC_GEN).c 43$(OUT_DIR)/$(YACC_GEN).o: $(OUT_DIR)/$(YACC_GEN).c
45 $(CC) -o $@ -c $^ $(IFLAGS) $(LFLAGS) $(CFLAGS) 44 $(CC) -o $@ -c $^ $(IFLAGS) $(LFLAGS) $(CFLAGS)
46 45
47$(OUT_DIR)/$(PARSER_BIN): $(OUT_DIR)/$(LEX_GEN).o $(OUT_DIR)/$(YACC_GEN).o 46$(OUT_DIR)/$(COMPIL_BIN): $(OUT_DIR)/$(LEX_GEN).o $(OUT_DIR)/$(YACC_GEN).o
48 $(CC) -o $@ $^ $(IFLAGS) $(LFLAGS) $(CFLAGS) 47 $(CC) -o $@ $^ $(IFLAGS) $(LFLAGS) $(CFLAGS)
49 48
50$(OUT_DIR)/$(REPORT_PDF): $(DOC_DIR)/$(PDF_SRC) 49$(OUT_DIR)/$(REPORT_PDF): $(DOC_DIR)/$(PDF_SRC)
diff --git a/res/exp.tpc b/res/exp.tpc
deleted file mode 100644
index 471c068..0000000
--- a/res/exp.tpc
+++ /dev/null
@@ -1,5 +0,0 @@
1/* exp.tpc */
2
3/* double valeur(double a, double b, double c, double x) ; */
4/* Résolution d'une équation du deuxième degré */
5 r1=(-b+s)/(2*a)+print(valeur(1,b,c,r1),valeur(1,b,c,r2))
diff --git a/res/instr.tpc b/res/instr.tpc
deleted file mode 100644
index 7153ac2..0000000
--- a/res/instr.tpc
+++ /dev/null
@@ -1,28 +0,0 @@
1/* instr.tpc */
2/* int trinome(float a, float b, float c) ;
3 double valeur(double a, double b, double c, double x) ; */
4/* Résolution d'une équation du deuxième degré */
5 b=-1;
6 while (b<=1) {
7 c=-1;
8 while (c<=1) {
9 print(b, c);
10 if (trinome(1,b,c)) {
11 print(r1, r2);
12 print(valeur(1,b,c,r1),valeur(1,b,c,r2));
13 }
14 c=c+1;
15 }
16 b=b+1;
17 }
18 return 0;
19 d=b*b-4*a*c;
20 if (d>=0) {
21 s=sqrt(d);
22 r1=(-b+s)/(2*a);
23 r2=(-b-s)/(2*a);
24 return 1;
25 }
26 return 0;
27 if (0<=r1 && r1<=max && 0>=r2 && r2>=-max)
28 return; \ No newline at end of file
diff --git a/res/ko_sample.tpc b/res/ko_sample.tpc
new file mode 100644
index 0000000..f3a4c7a
--- /dev/null
+++ b/res/ko_sample.tpc
@@ -0,0 +1,24 @@
1/**
2 * UPEM / Compilation / Projet TPC
3 * Exemple de fichier source TPC invalide
4 * Pacien TRAN-GIRARD, Adam NAILI
5 */
6
7const special = 'b';
8
9char funky_func(int arg) {
10 return !arg;
11}
12
13void main(void) {
14 void ret;
15 ret = 1 + funky_func(0) * 2;
16
17 while (ret) {
18 readc(ret);
19 print(ret);
20
21 if (ret == special) print('!');
22 }
23}
24
diff --git a/res/ok_sample.tpc b/res/ok_sample.tpc
new file mode 100644
index 0000000..7591dfd
--- /dev/null
+++ b/res/ok_sample.tpc
@@ -0,0 +1,24 @@
1/**
2 * UPEM / Compilation / Projet TPC
3 * Exemple de fichier source TPC valide
4 * Pacien TRAN-GIRARD, Adam NAILI
5 */
6
7const special = 'b';
8
9char funky_func(int arg) {
10 return !arg;
11}
12
13void main(void) {
14 char ret;
15 ret = 1 + funky_func(0) * 2;
16
17 while (ret) {
18 readc(ret);
19 print(ret);
20
21 if (ret == special) print('!');
22 }
23}
24
diff --git a/res/trinome.tpc b/res/trinome.tpc
deleted file mode 100644
index c3e2f94..0000000
--- a/res/trinome.tpc
+++ /dev/null
@@ -1,43 +0,0 @@
1/* #include <stdio.h>
2 #include <math.h> */
3/* int trinome(float a, float b, float c) ;
4 double valeur(double a, double b, double c, double x) ; */
5/* Résolution d'une équation du deuxième degré */
6float r1, r2;
7
8int main(void) {
9 int b, c;
10 b=-1;
11 while (b<=1) {
12 c=-1;
13 while (c<=1) {
14 print(b, c);
15 if (trinome(1,b,c)) {
16 print(r1, r2);
17 print(valeur(1,b,c,r1),valeur(1,b,c,r2));
18 if (0<=r1 && r1<=max && 0>=r2 && r2>=-max)
19 return 0;
20 }
21 c=c+1;
22 }
23 b=b+1;
24 }
25 return 0;
26}
27
28int trinome(float a,float b, float c) {
29 float d;
30 float s;
31 d=b*b-4*a*c;
32 if (d>=0) {
33 s=sqrt(d);
34 r1=(-b+s)/(2*a);
35 r2=(-b-s)/(2*a);
36 return 1;
37 }
38 return 0;
39}
40
41double valeur(double a, double b, double c, double x) {
42 return a*x*x+b*x+c;
43} \ No newline at end of file
diff --git a/src/tpc.lex b/src/tpc.lex
index eaeea89..8b824c0 100644
--- a/src/tpc.lex
+++ b/src/tpc.lex
@@ -14,37 +14,31 @@ int lineno = 1;
14 14
15%% 15%%
16[ \t\r]+ ; 16[ \t\r]+ ;
17\n { lineno++;} 17\n { lineno++; }
18"/*" { BEGIN COMMENT;} 18"/*" { BEGIN COMMENT; }
19&& { return AND; } 19"&&" { return AND; }
20"||" { return OR; } 20"||" { return OR; }
21"*"|"/"|% { yylval.divstar=yytext[0]; return DIVSTAR; } 21"*"|"/"|% { return DIVSTAR; }
22"+"|- { yylval.addsub=yytext[0]; return ADDSUB; } 22"+"|- { return ADDSUB; }
23"<"|"<="|">"|>= { strcpy(yylval.comp, yytext); return ORDER; } 23"<"|"<="|">"|">=" { return ORDER; }
24==|!= { strcpy(yylval.comp, yytext); return EQ; } 24==|!= { return EQ; }
25int { strcpy(yylval.type, yytext); return TYPE; } 25int { return TYPE; }
26float { strcpy(yylval.type, yytext); return TYPE; } 26char { return TYPE; }
27double { strcpy(yylval.type, yytext); return TYPE; }
28char { strcpy(yylval.type, yytext); return TYPE; }
29void { return VOID; } 27void { return VOID; }
30const { return CONST; } 28const { return CONST; }
31if { return IF;} 29if { return IF; }
32else { return ELSE;} 30else { return ELSE; }
33while { return WHILE; } 31while { return WHILE; }
34return { return RETURN; } 32return { return RETURN; }
35[a-zA-Z_][a-zA-Z0-9_]* { strcpy(yylval.ident, yytext); return IDENT; } 33print { return PRINT; }
36[0-9]+ { sscanf(yytext, "%d", &(yylval.num)); return NUM; } 34readc { return READC; }
37'\\?.' { if (strlen(yytext)==3) 35reade { return READE; }
38 yylval.caractere=yytext[1]; 36[a-zA-Z_][a-zA-Z0-9_]* { return IDENT; }
39 else switch(yytext[2]) { 37[0-9]+ { return NUM; }
40 case 'n': yylval.caractere='\n'; break; 38'\\?.' { return CARACTERE; }
41 case 't': yylval.caractere='\t'; break; 39. { return yytext[0]; }
42 case '\'': yylval.caractere='\''; break; 40<COMMENT>"*/" { BEGIN INITIAL; }
43 } 41<COMMENT>\n { lineno++; }
44 return CARACTERE; }
45. { return yytext[0];}
46<COMMENT>"*/" { BEGIN INITIAL;}
47<COMMENT>\n { lineno++;}
48<COMMENT>. ; 42<COMMENT>. ;
49%% 43%%
50 44
diff --git a/src/tpc.y b/src/tpc.y
index 11635f9..a44a9aa 100644
--- a/src/tpc.y
+++ b/src/tpc.y
@@ -12,127 +12,143 @@ void yyerror(char *);
12 12
13%} 13%}
14 14
15%union { 15%token CARACTERE NUM IDENT
16 char caractere; 16%token ADDSUB DIVSTAR
17 int num; 17%token ORDER EQ OR AND
18 char ident[64]; 18%token IF WHILE RETURN
19 char type[16]; 19%token CONST VOID TYPE
20 char comp[3]; 20%token PRINT READC READE
21 char addsub;
22 char divstar;
23}
24
25%token <caractere> CARACTERE
26%token <num> NUM
27%token <ident> IDENT
28%token <comp> ORDER EQ
29%token <addsub> ADDSUB
30%token <divstar> DIVSTAR
31%token OR AND CONST IF WHILE RETURN VOID
32%token <type> TYPE
33 21