diff options
-rw-r--r-- | makefile | 5 | ||||
-rw-r--r-- | res/exp.tpc | 5 | ||||
-rw-r--r-- | res/instr.tpc | 28 | ||||
-rw-r--r-- | res/ko_sample.tpc | 24 | ||||
-rw-r--r-- | res/ok_sample.tpc | 24 | ||||
-rw-r--r-- | res/trinome.tpc | 43 | ||||
-rw-r--r-- | src/tpc.lex | 46 | ||||
-rw-r--r-- | src/tpc.y | 238 |
8 files changed, 197 insertions, 216 deletions
@@ -16,7 +16,6 @@ LEX_GEN := tpc.yy | |||
16 | YACC_GEN := tpc.tab | 16 | YACC_GEN := tpc.tab |
17 | 17 | ||
18 | # OUTPUT | 18 | # OUTPUT |
19 | PARSER_BIN := tparser | ||
20 | COMPIL_BIN := tcompil | 19 | COMPIL_BIN := tcompil |
21 | COMMIT_LOG := commits.log | 20 | COMMIT_LOG := commits.log |
22 | REPORT_PDF := rapport.pdf | 21 | REPORT_PDF := rapport.pdf |
@@ -30,7 +29,7 @@ LFLAGS := -lfl -ly | |||
30 | IFLAGS += -I$(SRC_DIR) -I$(OUT_DIR) | 29 | IFLAGS += -I$(SRC_DIR) -I$(OUT_DIR) |
31 | 30 | ||
32 | # RULES | 31 | # RULES |
33 | all: clean $(OUT_DIR)/$(PARSER_BIN) | 32 | all: 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 | |||
7 | const special = 'b'; | ||
8 | |||
9 | char funky_func(int arg) { | ||
10 | return !arg; | ||
11 | } | ||
12 | |||
13 | void 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 | |||
7 | const special = 'b'; | ||
8 | |||
9 | char funky_func(int arg) { | ||
10 | return !arg; | ||
11 | } | ||
12 | |||
13 | void 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é */ | ||
6 | float r1, r2; | ||
7 | |||
8 | int 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 | |||
28 | int 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 | |||
41 | double 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; } |
25 | int { strcpy(yylval.type, yytext); return TYPE; } | 25 | int { return TYPE; } |
26 | float { strcpy(yylval.type, yytext); return TYPE; } | 26 | char { return TYPE; } |
27 | double { strcpy(yylval.type, yytext); return TYPE; } | ||
28 | char { strcpy(yylval.type, yytext); return TYPE; } | ||
29 | void { return VOID; } | 27 | void { return VOID; } |
30 | const { return CONST; } | 28 | const { return CONST; } |
31 | if { return IF;} | 29 | if { return IF; } |
32 | else { return ELSE;} | 30 | else { return ELSE; } |
33 | while { return WHILE; } | 31 | while { return WHILE; } |
34 | return { return RETURN; } | 32 | return { return RETURN; } |
35 | [a-zA-Z_][a-zA-Z0-9_]* { strcpy(yylval.ident, yytext); return IDENT; } | 33 | print { return PRINT; } |
36 | [0-9]+ { sscanf(yytext, "%d", &(yylval.num)); return NUM; } | 34 | readc { return READC; } |
37 | '\\?.' { if (strlen(yytext)==3) | 35 | reade { 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 | ||
@@ -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 | ||