git.maugern.fr Git - T7/blob - args.c
First improvements
[T7] / args.c
1 /*
2  * Code generation using subroutine arguments
3  *
4  * Copyright (C) 2018 Nicolas Mauger
5  * This file is subject to the terms and conditions of the
6  * CeCILL free software license agreement. See the file
7  * LICENSE in the main directory of T7 for more details.
8  */
9
10 #include <stdio.h>
11
12 #include "lex.h"
13
14 void expression (char *tempvar ) ;
15 void factor     (char *tempvar ) ;
16 void term       (char *tempvar ) ;
17
18 extern char *newname (void ) ;
19 extern void freename (char *name);
20
21 void statements(char *tempvar)
22 {
23     /* statements -> expression SEMI | expression SEMI statements */
24
25     while (!match(EOI))
26     {
27         expression(tempvar = newname());
28         freename(tempvar);
29
30         if (match(SEMI)) advance();
31         else
32         {
33             fprintf(stderr, "%d: Inserting missing semicolon\n", yylineno);
34         }
35     }
36 }
37
38 void expression(char *tempvar)
39 {
40     /* expression  -> term expression'
41      * expression' -> PLUS term expression' | epsilon
42      */
43
44     char *tempvar2;
45     term(tempvar);
46
47     while (match(PLUS))
48     {
49         advance();
50
51         term(tempvar2 = newname());
52
53         printf("    %s += %s\n", tempvar, tempvar2);
54         freename(tempvar2);
55     }
56 }
57
58 void term(char *tempvar)
59 {
60
61     char *tempvar2;
62
63     factor(tempvar);
64
65     while (match(TIMES))
66     {
67         advance();
68         factor(tempvar2 = newname());
69         printf("    %s *= %s\n", tempvar, tempvar2);
70         freename(tempvar2);
71     }
72 }
73
74 void factor(char *tempvar)
75 {
76     if (match(NUM_OR_ID))
77     {
78         printf("    %s = %-*s\n", tempvar, yyleng, yytext);
79         advance();
80     }
81     else if (match(LP))
82     {
83         advance();
84         expression(tempvar);
85
86         if (match(RP)) advance();
87         else
88         {
89             fprintf(stderr, "%d: Mismatched parenthesis\n", yylineno);
90         }
91     }
92     else
93     {
94         fprintf(stderr, "%d: Number or identifier expected\n", yylineno);
95     }
96 }