-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathexpressions.c
96 lines (87 loc) · 2.62 KB
/
expressions.c
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
#include <stdlib.h>
#include "headers/tokenReader.h"
#include "headers/utilities.h"
#include "headers/variables.h"
#include "headers/executor.h"
#include "headers/expressions.h"
#define TOKEN program->currentToken
void calcExpression(int *result, struct Program *program) {
readToken(program);
addOrSub(result, program);
}
void addOrSub(int *result, struct Program *program) {
char operation;
multOrDiv(result, program);
int hold;
while ((operation = *TOKEN.name) == '+' || operation == '-') {
readToken(program);
multOrDiv(&hold, program);
arithmetic(operation, result, &hold);
}
}
void multOrDiv(int *result, struct Program *program) {
char operation;
unary(result, program);
int hold; //правая часть
while ((operation = *TOKEN.name) == '/' || operation == '%' || operation == '*') {
readToken(program);
unary(&hold, program);
arithmetic(operation, result, &hold);
}
}
void unary(int *result, struct Program *program) {
char operation;
if (TOKEN.type == DELIMITER && ((operation = *TOKEN.name) == '+' || operation == '-')) {
readToken(program);
}
parentheses(result, program);
if (operation == '-')
*result = -(*result);
}
void parentheses(int *result, struct Program *program) {
char operation = *TOKEN.name;
if (TOKEN.type == DELIMITER && operation == '(') {
readToken(program);
addOrSub(result, program);
if (*TOKEN.name != ')')
printError("This is not an expression!");
readToken(program);
} else {
struct Variable *temp = findVariable(TOKEN.name, program);
switch (TOKEN.type) {
case VARIABLE:
*result = temp->value;
readToken(program);
return;
case NUMBER:
*result = atoi(TOKEN.name);
readToken(program);
return;
default:
printError("Syntax error!");
}
}
}
void arithmetic(char operation, int *leftPart, const int *rightPart) {
int t;
switch (operation) {
case '-':
*leftPart = *leftPart - *rightPart;
break;
case '+':
*leftPart = *leftPart + *rightPart;
break;
case '*':
*leftPart = *leftPart * *rightPart;
break;
case '/':
*leftPart = (*leftPart) / (*rightPart);
break;
case '%':
t = (*leftPart) / (*rightPart);
*leftPart = *leftPart - (t * (*rightPart));
break;
default:
break;
}
}