-
Notifications
You must be signed in to change notification settings - Fork 0
/
prob6a.y
63 lines (58 loc) · 1.27 KB
/
prob6a.y
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
%{
#include <stdio.h>
#include <string.h>
void yyerror(const char *message);
char msg[500];
%}
%union{
struct s2{
int col;
int row;
}mat;
int value;
int col;
}
%token <value> INT
%token <col> LPA
%token <col> LMA
%token <col> UT
%token <col> ADDER
%token <col> SUB
%token <col> MUL
%type <mat> expr
%type <mat> term1
%type <mat> term2
%type <mat> factor
%type <mat> matrix
%%
line :expr {printf("Accepted\n");}
;
expr :expr ADDER term1 {if($1.col == $3.col && $1.row == $3.row){
$$ = $1;}
else{printf("Semantic error on col %d\n", $2);return(0);}}
| expr SUB term1 {if($1.col == $3.col && $1.row == $3.row){
$$ = $1;}
else{printf("Semantic error on col %d\n", $2);return(0);}}
| term1 {$$ = $1;}
;
term1: term1 MUL term2 {if($1.col == $3.row){
$$.row = $1.row; $$.col = $3.col;}
else{printf("Semantic error on col %d\n", $2);return(0);}}
| term2 {$$ = $1;}
;
term2: term2 UT {$$.col = $1.row; $$.row = $1.col;}
| factor {$$ = $1;}
;
factor : LPA expr ')' {$$ = $2;}
| matrix
;
matrix : LMA INT ',' INT ']' {$$.row = $2; $$.col = $4;}
;
%%
void yyerror(const char* message){
printf("%s\n", "Syntax error");
}
int main(int argc, char* argv[]){
yyparse();
return(0);
}