aboutsummaryrefslogtreecommitdiff
path: root/src/tpc.y
blob: 31452fef2f905f422a6e469c2b7932c02aff4a3a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
%{
/*
 * UPEM / Compilation / Projet
 * Pacien TRAN-GIRARD, Adam NAILI
 */

#include <stdio.h>

extern int lineno;
int yylex();
void yyerror(char *);

%}

%token CARACTERE NUM IDENT ORDER EQ ADDSUB DIVSTAR
%token OR AND CONST IF WHILE RETURN VOID TYPE

%left ','
%precedence ')'
%precedence ELSE

%%
Prog         : DeclConsts DeclVars DeclFoncts
             ;
DeclConsts   : DeclConsts CONST ListConst ';'
             |
             ;
ListConst    : ListConst ',' IDENT '=' Litteral
             | IDENT '=' Litteral
             ;
Litteral     : NombreSigne
             | CARACTERE
             ;
NombreSigne  : NUM
             | ADDSUB NUM
             ;
DeclVars     : DeclVars TYPE Declarateurs ';'
             |
             ;
Declarateurs : Declarateurs ',' Declarateur
             | Declarateur
             ;
Declarateur  : IDENT
             | IDENT '[' NUM ']'
             ;
DeclFoncts   : DeclFoncts DeclFonct
             | DeclFonct
             ;
DeclFonct    : EnTeteFonct Corps
             ;
EnTeteFonct  : TYPE IDENT '(' Parametres ')'
             | VOID IDENT '(' Parametres ')'
             ;
Parametres   : VOID
             | ListTypVar
             ;
ListTypVar   : ListTypVar ',' TYPE IDENT
             | TYPE IDENT
             ;
Corps        : '{' DeclConsts DeclVars SuiteInstr '}'
             ;
SuiteInstr   : SuiteInstr Instr
             |
             ;
Instr        : Exp ';'
             | RETURN Exp ';'
             | RETURN ';'
             | ';'
             | IF '(' Exp ')' Instr
             | IF '(' Exp ')' Instr ELSE Instr
             | WHILE '(' Exp ')' Instr
             | '{' SuiteInstr '}'
             ;
Exp          : LValue '=' Exp
             | EB
             ;
EB           : EB OR TB
             | TB
             ;
TB           : TB AND FB
             | FB
             ;
FB           : FB EQ M
             | M
             ;
M            : M ORDER E
             | E
             ;
E            : E ADDSUB T
             | T
             ;
T            : T DIVSTAR F
             | F
             ;
F            : ADDSUB F
             | '!' F
             | '(' Exp ')'
             | LValue
             | NUM
             | CARACTERE
             | IDENT '(' Arguments ')'
             ;
LValue       : IDENT
             | IDENT  '[' Exp ']'
             ;
Arguments    : ListExp
             |
             ;
ListExp      : ListExp ',' ListExp
             | Exp
             ;
%%

void yyerror(char *msg){
  fprintf(stderr, "%s at line %d\n", msg, lineno);
}

int main(int argc, char **argv) {
  return yyparse();
}