#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 4000
#define RCVBUFSIZE 8192
int is_while(char *);
int is_if(char *);
int is_fi(char *);
int is_then(char *);
int is_else(char *);
int is_do(char *);
int is_od(char *);
int is_begin(char *);
int is_end(char *);
int is_set(char *);
int is_id(char *);
int is_plus(char *);
int is_mult(char *);
int is_minus(char *);
int is_div(char *);
int is_semicolon(char *);
int is_open_round_bracked(char *);
int is_closed_round_bracked(char *);
int is_cop_equal(char *);
int is_cop_less(char *);
int is_cop_greater(char *);
int is_cop_less_equal(char *);
int is_cop_greater_equal(char *);
int is_num(char *);
int is_while(char *str) {return ((str[0] == 'w') && (str[1] == 'h') && (str[2] == 'i') && (str[3] == 'l') && (str[4] == 'e') && (str[5] == 0));}
int is_if(char *str) {return ((str[0] == 'i') && (str[1] == 'f') && (str[2] == 0));}
int is_fi(char *str) {return ((str[0] == 'f') && (str[1] == 'i') && (str[2] == 0));}
int is_then(char *str) {return ((str[0] == 't') && (str[1] == 'h') && (str[2] == 'e') && (str[3] == 'n') && (str[4] == 0));}
int is_else(char *str) {return ((str[0] == 'e') && (str[1] == 'l') && (str[2] == 's') && (str[3] == 'e'));}
int is_do(char *str) {return ((str[0] == 'd') && (str[1] == 'o') && (str[2] == 0));}
int is_od(char *str) {return ((str[0] == 'o') && (str[1] == 'd') && (str[2] == 0));}
int is_begin(char *str) {return ((str[0] == 'b') && (str[1] == 'e') && (str[2] == 'g') && (str[3] == 'i') && (str[4] == 'n') && (str[5] == 0));}
int is_print(char *str) {return ((str[0] == 'p') && (str[1] == 'r') && (str[2] == 'i') && (str[3] == 'n') && (str[4] == 't') && (str[5] == 0));}
int is_end(char *str) {return ((str[0] == 'e') && (str[1] == 'n') && (str[2] == 'd') && (str[3] == 0));}
int is_set(char *str) {return ((str[0] == ':') && (str[1] == '=') && (str[2] == 0));}
int is_id(char *str) {return ((str[0] >= 'a') && (str[0] <= 'z') && (str[1] == 0));}
int is_plus(char *str) {return ((str[0] == '+') && (str[1] == 0));}
int is_minus(char *str) {return ((str[0] == '-') && (str[1] == 0));}
int is_mult(char *str) {return ((str[0] == '*') && (str[1] == 0));}
int is_div(char *str) {return ((str[0] == '/') && (str[1] == 0));}
int is_semicolon(char *str) {return ((str[0] == ';') && (str[1] == 0));}
int is_open_round_bracked(char *str) {return ((str[0] == '(') && (str[1] == 0));}
int is_closed_round_bracked(char *str) {return ((str[0] == ')') && (str[1] == 0));}
int is_cop_equal(char *str) {return ((str[0] == '=') && (str[1] == '=') && (str[2] == 0));}
int is_cop_less(char *str) {return ((str[0] == '<') && (str[1] == 0));}
int is_cop_less_equal(char *str) {return ((str[0] == '<') && (str[1] == '=') && (str[2] == 0));}
int is_cop_greater(char *str) {return ((str[0] == '>') && (str[1] == 0));}
int is_cop_greater_equal(char *str) {return ((str[0] == '>') && (str[1] == '=') && (str[2] == 0));}
int is_num(char *str) {
int flag = 1;
int i;
for(i = 0; str[i] != 0; i++)
if(!((str[i] >= '0') && (str[i] <= '9')))
flag = 0;
return flag;
}
char buf[1024*1024];
char tmp_str[256];
int buf_i = 0;
int buf_len;
int line_counter = 0;
int line_cntr = 0;
char var_name_str_array[128][128];
int var_name_str_array_stack_ptr = 0;
#define N_LINES 256
#define LINE_MAX_CH 128
#define N_VAR_ABC 26
#define N_VAR_X 1024
#define N_ATOM 20
#define ATOM_MAX_CH 16
#define N_LABELS 16
char code[N_LINES][LINE_MAX_CH];
int var_abc[N_VAR_ABC];
int var_x[N_VAR_X];
char atom[N_ATOM][ATOM_MAX_CH];
int labels[N_LABELS];
int get_atom_token(char *d, char *s) {
char *p;
p = s;
while ((*s != ' ' ) && (*s != 0) && (*s != ',') && (*s != '\n')) {
*d = *s;
s++;
d++;
}
*d = 0;
while ((*s == ',') || (*s == ' ') || (*s == '\n')) s++;
return (s-p);
}
int get_atoms(int line) {
int i;
int length;
int length2;
length = 0;
for (i = 0; ; i++) {
if((length2 = get_atom_token(atom[i], code[line] + length)) == 0)
break;
length += length2;
}
return 9;
}
int get_index_of_x_var(char *s) {
int i;
s++;
i = 0;
while (*s != 0) {
i += *s - '0';
i *= 10;
s++;
}
i /= 10;
return i;
}
int strint(char *s) {
int i;
i = 0;
while (*s != 0) {
i += *s - '0';
i *= 10;
s++;
}
i /= 10;
return i;
}
void push_var_name_str(char *str) {
strcpy(var_name_str_array[var_name_str_array_stack_ptr], str);
var_name_str_array_stack_ptr++;
return;
}
void pop_var_name_str(char *str) {
var_name_str_array_stack_ptr--;
strcpy(str, var_name_str_array[var_name_str_array_stack_ptr]);
return;
}
int expr_next_var_name_i = 1;
void expr_get_prev_var_name(char *str) {
sprintf(str, "x%i", expr_next_var_name_i-1);
return;
}
void expr_get_next_var_name(char *str) {
sprintf(str, "x%i", expr_next_var_name_i);
expr_next_var_name_i++;
return;
}
char label_str_array[128][128];
int label_str_array_stack_ptr = 0;
void push_label_str(char *str) {
strcpy(label_str_array[label_str_array_stack_ptr], str);
label_str_array_stack_ptr++;
return;
}
void pop_label_str(char *str) {
label_str_array_stack_ptr--;
strcpy(str, label_str_array[label_str_array_stack_ptr]);
return;
}
int expr_next_label_i = 1;
void get_prev_label(char *str) {
sprintf(str, "label %i", expr_next_label_i-1);
return;
}
void get_next_label(char *str) {
sprintf(str, "label %i", expr_next_label_i);
expr_next_label_i++;
return;
}
int lex_get_token_from_stream(char *str) {
int i;
int ch;
if(buf_i == buf_len)
return 0;
ch = buf[buf_i];
i = 0;
if ((((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) || (ch == '_')) && ((buf_i + i ) < buf_len)) {
str[i] = ch;
i++;
ch = buf[buf_i + i];
while ((((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) || (ch == '_')) && ((buf_i + i) < buf_len)) {
str[i] = ch;
i++;
ch = buf[buf_i + i];
}
str[i] = 0;
}
else if ((ch >= '0') && (ch <= '9') && ((buf_i + i ) < buf_len)) {
str[i] = ch;
i++;
ch = buf[buf_i + i];
while ((ch >= '0') && (ch <= '9') && ((buf_i + i ) < buf_len)) {
str[i] = ch;
i++;
ch = buf[buf_i + i];
}
str[i] = 0;
}
else if(ch == '=') {
str[i] = ch;
i++;
ch = buf[buf_i + i];
if(ch == '=') {
str[i] = ch;
i++;
}
str[i] = 0;
}
else if(ch == '!') {
str[i] = ch;
i++;
ch = buf[buf_i + i];
if(ch == '=') {
str[i] = ch;
i++;
}
str[i] = 0;
}
else if(ch == '<') {
str[i] = ch;
i++;
ch = buf[buf_i + i];
if(ch == '=') {
str[i] = ch;
i++;
}
str[i] = 0;
}
else if(ch == '>') {
str[i] = ch;
i++;
ch = buf[buf_i + i];
if(ch == '=') {
str[i] = ch;
i++;
}
str[i] = 0;
}
else if(ch == ':') {
str[i] = ch;
i++;
ch = buf[buf_i + i];
if(ch == '=') {
str[i] = ch;
i++;
}
str[i] = 0;
}
else if(ch == '.') {
str[i] = ch;
i++;
ch = buf[buf_i + 1];
if(ch == '.') {
str[i] = ch;
i++;
}
str[i] = 0;
}
else {
str[i] = ch;
i++;
str[i] = 0;
}
return i;
}
int lex_get_token_from_stream_ws(char *str) {
int i;
i = lex_get_token_from_stream(str);
while (((str[0] == '\n') || (str[0] == '\t') || (str[0] == '\r') || (str[0] == ' ')) && ((buf_i + i) < buf_len)) {
buf_i += i;
i = lex_get_token_from_stream(str);
if(i == 0)
return 0;
}
return i;
}
int statement(void);
int statement2(void);
int assignment(void);
int cond(void);
int loop(void);
int expr(void);
int boolexpr(void);
int numexpr(void);
int numexpr2(void);
int term(void);
int term2(void);
int factor (void);
int print (void);
int program (void);
int id (void);
int statement2(void) {
char str[256];
int buf_i_start;
int retval = 1;
int buf_j;
buf_i_start = buf_i;
if(assignment())
retval = 1;
else if(cond())
retval = 1;
else if(loop())
retval = 1;
else if(print())
retval = 1;
else {
buf_i = buf_i_start;
retval = 0;
}
return retval;
}
int statement(void) {
char str[256];
int buf_i_start;
int retval = 1;
int buf_j;
buf_i_start = buf_j;
if(statement2()) {
buf_j = lex_get_token_from_stream_ws(str);
if (is_semicolon(str)) {
buf_i += buf_j;
retval = statement();
}
else
retval = 1;
}
else {
retval = 0;
buf_i = buf_i_start;
}
return retval;
}
int id (void) {
char str[256];
int buf_i_start;
int retval = 1;
int buf_j;
buf_i_start = buf_i;
buf_j = lex_get_token_from_stream_ws(str);
if (is_id(str)) {
buf_i += buf_j;
retval = 1;
}
else {
buf_i = buf_i_start;
retval = 0;
}
return retval;
}
int print (void) {
char str[256];
int buf_i_start;
int retval = 1;
int buf_j;
buf_i_start = buf_i;
buf_j = lex_get_token_from_stream_ws(str);
if (is_print(str)) {
sprintf(code[line_cntr], "print ");
buf_i += buf_j;
buf_j = lex_get_token_from_stream_ws(str);
if (is_id(str)) {
sprintf(code[line_cntr]+strlen("print "), "%s", str);
line_cntr++;
buf_i += buf_j;
retval = 1;
}
else {
buf_i = buf_i_start;
retval = 0;
}
}
else {
buf_i = buf_i_start;
retval = 0;
}
return retval;
}
int assignment(void) {
char str[256];
char str1[256];
char str2[256];
int buf_i_start;
int retval = 1;
int buf_j;
buf_i_start = buf_i;
buf_j = lex_get_token_from_stream_ws(str);
if (is_id(str)) {
push_var_name_str(str);
buf_i += buf_j;
buf_j = lex_get_token_from_stream_ws(str);
if (is_set(str)) {
buf_i += buf_j;
if (numexpr()) {
pop_var_name_str(str1);
pop_var_name_str(str2);
sprintf(code[line_cntr], "set %s, %s", str2, str1);
line_cntr++;
return 1;
}
else {
retval = 0;
buf_i = buf_i_start;
}
}
else {
retval = 0;
buf_i = buf_i_start;
}
}
else {
retval = 0;
buf_i = buf_i_start;
}
return retval;
}
int cond(void) {
char str[256];
char label_str[256];
char label_str2[256];
int buf_i_start;
int retval = 1;
int buf_j;
buf_i_start = buf_i;
buf_j = lex_get_token_from_stream_ws(str);
if (is_if(str)) {
buf_i += buf_j;
sprintf(code[line_cntr], "jump if not");
line_cntr++;
if (boolexpr()) {
get_next_label(label_str);
push_label_str(label_str);
sprintf(code[line_cntr],"to %s", label_str);
line_cntr++;
buf_j = lex_get_token_from_stream_ws(str);
if (is_then(str)) {
buf_i += buf_j;
if (statement()) {
buf_j = lex_get_token_from_stream_ws(str);
if (is_fi(str)) {
buf_i += buf_j;
retval = 1;
pop_label_str(label_str);
sprintf(code[line_cntr],"%s ", label_str);
line_cntr++;
}
else if (is_else(str)) {
get_next_label(label_str2);
sprintf(code[line_cntr],"jmp to %s", label_str2);
line_cntr++;
pop_label_str(label_str);
push_label_str(label_str2);
sprintf(code[line_cntr],"%s ", label_str);
line_cntr++;
buf_i += buf_j;
if (statement()) {
buf_j = lex_get_token_from_stream_ws(str);
if (is_fi(str)) {
buf_i += buf_j;
retval = 1;
}
else {
buf_i = buf_i_start;
retval = 0;
}
}
else {
buf_i = buf_i_start;
retval = 0;
}
pop_label_str(label_str);
sprintf(code[line_cntr],"%s ", label_str);
line_cntr++;
}
else {
buf_i = buf_i_start;
retval = 0;
}
}
else {
buf_i = buf_i_start;
retval = 0;
}
}
else {
buf_i = buf_i_start;
retval = 0;
}
}
else {
buf_i = buf_i_start;
retval = 0;
}
}
else {
retval = 0;
buf_i = buf_i_start;
}
return retval;
}
int loop(void) {
char str[256];
int buf_i_start;
int retval = 1;
int buf_j;
char label_str[128];
char label_str2[128];
buf_i_start = buf_i;
buf_j = lex_get_token_from_stream_ws(str);
if (is_while(str)) {
buf_i += buf_j;
get_next_label(label_str2);
sprintf(code[line_cntr], "%s", label_str2);
line_cntr++;
push_label_str(label_str2);
sprintf(code[line_cntr], "jump if not");
line_cntr++;
if (boolexpr()) {
get_next_label(label_str);
push_label_str(label_str);
sprintf(code[line_cntr], "to %s", label_str);
line_cntr++;
buf_j = lex_get_token_from_stream_ws(str);
if (is_do(str)) {
buf_i += buf_j;
if(statement()) {
buf_j = lex_get_token_from_stream_ws(str);
if (is_od(str)) {
buf_i += buf_j;
retval = 1;
pop_label_str(label_str);
pop_label_str(label_str2);
sprintf(code[line_cntr], "jump to %s", label_str2);
line_cntr++;
sprintf(code[line_cntr], "%s ", label_str);
line_cntr++;
}
else {
retval = 0;
buf_i = buf_i_start;
}
}
else {
retval = 0;
buf_i = buf_i_start;
}
}
else {
retval = 0;
buf_i = buf_i_start;
}
}
else {
retval = 0;
buf_i = buf_i_start;
}
}
else {
retval = 0;
buf_i = buf_i_start;
}
return retval;
}
int expr(void) {
int buf_i_start;
int retval = 1;
buf_i_start = buf_i;
if (boolexpr())
retval = 1;
else if (numexpr())
retval = 1;
else {
buf_i = buf_i_start;
retval = 0;
}
return retval;
}
int boolexpr(void) {
char str[256];
int buf_i_start;
int retval = 1;
int buf_j;
char tmp_str2[128];
char tmp_str3[128];
buf_i_start = buf_i;
if (numexpr()) {
buf_j = lex_get_token_from_stream_ws(str);
if (is_cop_equal(str)) {
buf_i += buf_j;
if (numexpr()) {
pop_var_name_str(tmp_str2);
pop_var_name_str(tmp_str3);
sprintf(code[line_cntr], "equal %s, %s", tmp_str2, tmp_str3);
line_cntr++;
retval = 1;
}
else {
buf_i = buf_i_start;
retval = 0;
}
}
else if (is_cop_greater(str)) {
buf_i += buf_j;
if (numexpr()) {
pop_var_name_str(tmp_str2);
pop_var_name_str(tmp_str3);
sprintf(code[line_cntr], "greater %s, %s", tmp_str2, tmp_str3);
line_cntr++;
retval = 1;
}
else {
buf_i = buf_i_start;
retval = 0;
}
}
else if (is_cop_greater_equal(str)) {
buf_i += buf_j;
if (numexpr()) {
pop_var_name_str(tmp_str2);
pop_var_name_str(tmp_str3);
sprintf(code[line_cntr], "greaterequal %s, %s", tmp_str2, tmp_str3);
line_cntr++;
retval = 1;
}
else {
buf_i = buf_i_start;
retval = 0;
}
}
else if (is_cop_less(str)) {
buf_i += buf_j;
if (numexpr()) {
pop_var_name_str(tmp_str2);
pop_var_name_str(tmp_str3);
sprintf(code[line_cntr], "less %s, %s", tmp_str2, tmp_str3);
line_cntr++;
retval = 1;
}
else {
buf_i = buf_i_start;
retval = 0;
}
}
else if (is_cop_less_equal(str)) {
buf_i += buf_j;
if (numexpr()) {
pop_var_name_str(tmp_str2);
pop_var_name_str(tmp_str3);
sprintf(code[line_cntr], "lessequal %s, %s", tmp_str2, tmp_str3);
line_cntr++;
retval = 1;
}
else {
buf_i = buf_i_start;
retval = 0;
}
}
else {
retval = 0;
buf_i = buf_i_start;
}
}
else {
retval = 0;
buf_i = buf_i_start;
}
return retval;
}
int numexpr(void) {
char str[256];
int buf_i_start;
int retval = 1;
int retval2;
int retval3;
int buf_j;
buf_i_start = buf_i;
retval2 = term();
if (retval2) {
retval3 = numexpr2 ();
if(retval3);
else {
buf_i = buf_i_start;
retval = 0;
}
}
else {
buf_i = buf_i_start;
retval = 0;
}
return (retval | retval2 | retval3);
}
int numexpr2(void) {
char str[256];
int buf_i_start;
int retval = 1;
int retval2;
int retval3;
int buf_j;
char tmp_str[128];
char tmp_str2[128];
char tmp_str3[128];
char tmp_str4[128];
buf_i_start = buf_i;
buf_j = lex_get_token_from_stream_ws(str);
if (is_plus(str)) {
buf_i += buf_j;
retval2 = term ();
pop_var_name_str(tmp_str2);
pop_var_name_str(tmp_str3);
expr_get_next_var_name(tmp_str4);
sprintf(code[line_cntr], "add %s, %s, %s", tmp_str4, tmp_str2, tmp_str3);
line_cntr++;
push_var_name_str(tmp_str4);
if(retval2) {
retval3 = numexpr2 ();
if(retval3);
else {
buf_i = buf_i_start;
retval = 0;
}
}
else {
buf_i = buf_i_start;
retval = 0;
}
}
else {
buf_i = buf_i_start;
retval = 0;
}
return (retval | retval2 | retval3);
}
int term(void) {
char str[256];
int buf_i_start;
int retval = 1;
int buf_j;
int retval2;
int retval3;
buf_i_start = buf_i;
retval2 = factor();
if (retval2) {
retval3 = term2 ();
if(retval3);
else {
buf_i = buf_i_start;
retval = 0;
}
}
else {
buf_i = buf_i_start;
retval = 0;
}
return (retval | retval2 | retval3);
}
int term2(void) {
char str[256];
int buf_i_start;
int retval = 1;
int retval2;
int retval3;
int buf_j;
char tmp_str[128];
char tmp_str2[128];
char tmp_str3[128];
char tmp_str4[128];
buf_i_start = buf_i;
buf_j = lex_get_token_from_stream_ws(str);
if (is_mult(str)) {
buf_i += buf_j;
retval2 = factor ();
pop_var_name_str(tmp_str2);
pop_var_name_str(tmp_str3);
expr_get_next_var_name(tmp_str4);
sprintf(code[line_cntr], "mul %s, %s, %s", tmp_str4, tmp_str2, tmp_str3);
line_cntr++;
push_var_name_str(tmp_str4);
if(retval2) {
retval3 = term2 ();
if(retval3);
else {
buf_i = buf_i_start;
retval = 0;
}
}
else {
buf_i = buf_i_start;
retval = 0;
}
}
else {
buf_i = buf_i_start;
retval = 0;
}
return (retval | retval2 | retval3);
}
int factor (void) {
char str[256];
int buf_i_start;
int retval = 1;
int buf_j;
char tmp_str[128];
char tmp_str2[128];
char tmp_str3[128];
char tmp_str4[128];
buf_i_start = buf_i;
buf_j = lex_get_token_from_stream_ws(str);
if (is_id(str)) {
buf_i += buf_j;
retval = 1;
push_var_name_str(str);
}
else if (is_open_round_bracked(str)) {
buf_i += buf_j;
if (retval = numexpr()) {
buf_j = lex_get_token_from_stream_ws(str);
if (is_closed_round_bracked(str)) {
buf_i += buf_j;
retval = 1;
}
}
else {
buf_i = buf_i_start;
retval = 0;
}
}
else if (is_num(str)) {
buf_i += buf_j;
retval = 1;
push_var_name_str(str);
}
else {
buf_i = buf_i_start;
retval = 0;
}
return retval;
}
int program2(void) {
char str[256];
int buf_i_start;
int retval = 1;
int buf_j;
retval = statement();
return retval;
}
int program(void) {
char str[256];
int buf_i_start;
int retval = 1;
int buf_j;
buf_i_start = buf_i;
retval = program2();
if (retval) {
buf_j = lex_get_token_from_stream_ws(str);
if (is_end(str)) {
buf_i += buf_j;
retval = 1;
}
else {
buf_i = buf_i_start;
retval = 0;
}
}
return retval;
}
static void get_buf(int client_socket)
{
int recv_size;
time_t zeit;
if((recv_size = recv(client_socket, buf, RCVBUFSIZE,0)) < 0) {
perror("Fehler bei recv()");
exit(1);
}
buf[recv_size] = '\0';
return;
}
int main(int argc, char *argv[]) {
FILE *fp;
char str[256];
char send_buf[8192];
char str_send_buf[128];
int i;
int op1, op2, op3;
int op1_num, op2_num, op3_num;
int labelc;
struct sockaddr_in server, client;
int sock, fd;
unsigned int len;
strcpy(send_buf, "");
strcpy(str_send_buf, "");
sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock < 0) {
perror("Fehler beim Anlegen eines Sockets");
exit(1);
}
memset( &server, 0, sizeof (server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(PORT);
if(bind(sock,(struct sockaddr*)&server, sizeof( server)) < 0) {
perror("Kann das Socket nicht \"binden\"");
exit(1);
}
if(listen(sock, 5) == -1 ) {
perror("Fehler bei listen");
exit(1);
}
for (;;) {
len = sizeof(client);
fd = accept(sock, (struct sockaddr*)&client, &len);
if (fd < 0) {
perror("Fehler bei accept");
exit(1);
}
printf("Bearbeite den Client mit der Adresse: %s\n",
inet_ntoa(client.sin_addr));
get_buf(fd);
close(fd);
if(program())
fprintf(stderr, "\n\n\nDer Code enthaelt keine Fehler - NO ERROR!!!\n");
else
fprintf(stderr, "\n\n\nDer Code enthaelt einen Fehler - ERROR!!!\n");
fclose(fp);
line_counter = line_cntr;
for(i = 0; i < line_counter; i++)
printf("%s\n", code[i]);
for (i = 0; i < N_VAR_ABC; i++)
var_abc[i] = 0;
for (i = 0; i < N_VAR_X; i++)
var_x[i] = 0;
for (i = 0; i < N_LABELS; i++)
labels[i] = -1;
for (i = 0; i < line_counter; i++) {
get_atoms(i);
if (strcmp(atom[0], "label") == 0) {
labelc = strint(atom[1]);
labels[labelc] = i;
}
}
for(i = 0; i < N_LABELS; i++)
fprintf(stderr, "%i\n", labels[i]);
fprintf(stderr, "\n\n");
for (i = 0; i < line_counter; i++) {
get_atoms(i);
if(strcmp(atom[0], "add") == 0) {
if((atom[1][0] == 'x') && ((atom[1][1] >= '0' ) && (atom[1][1] <= '9'))) {
op1 = get_index_of_x_var(atom[1]);
if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
op2 = get_index_of_x_var(atom[2]);
if((atom[3][0] == 'x') && ((atom[3][1] >= '0' ) && (atom[3][1] <= '9'))) {
op3 = get_index_of_x_var(atom[3]);
var_x[op1] = var_x[op2] + var_x[op3];
}
else if(((atom[3][0] >= 'a') && (atom[3][0] <= 'z')) && (atom [3][1] == 0)) {
op3 = atom[3][0] - 'a';
var_x[op1] = var_x[op2] + var_abc[op3];
}
else if((atom[3][0] >= '0') && (atom[3][0] <= '9')) {
op3_num = strint(atom[3]);
var_x[op1] = var_x[op2] + op3_num;
}
}
else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
op2 = atom[2][0] - 'a';
if((atom[3][0] == 'x') && ((atom[3][1] >= '0' ) && (atom[3][1] <= '9'))) {
op3 = get_index_of_x_var(atom[3]);
var_x[op1] = var_abc[op2] + var_x[op3];
}
else if(((atom[3][0] >= 'a') && (atom[3][0] <= 'z')) && (atom [3][1] == 0)) {
op3 = atom[3][0] - 'a';
var_x[op1] = var_abc[op2] + var_abc[op3];
}
else if((atom[3][0] >= '0') && (atom[3][0] <= '9')) {
op3_num = strint(atom[3]);
var_x[op1] = var_abc[op2] + op3_num;
}
}
else if(((atom[2][0] >= '0') && (atom[2][0] <= '9'))) {
op2_num = strint(atom[2]);
if((atom[3][0] == 'x') && ((atom[3][1] >= '0' ) && (atom[3][1] <= '9'))) {
op3 = get_index_of_x_var(atom[3]);
var_x[op1] = op2_num + var_x[op3];
}
else if(((atom[3][0] >= 'a') && (atom[3][0] <= 'z')) && (atom [3][1] == 0)) {
op3 = atom[3][0] - 'a';
var_x[op1] = op2_num + var_abc[op3];
}
else if((atom[3][0] >= '0') && (atom[3][0] <= '9')) {
op3_num = strint(atom[3]);
var_x[op1] = op2_num + op3_num;
}
}
}
else if(((atom[1][0] >= 'a') && (atom[1][0] <= 'z')) && (atom [1][1] == 0)) {
op1 = atom[1][0] - 'a';
if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
op2 = get_index_of_x_var(atom[2]);
if((atom[3][0] == 'x') && ((atom[3][1] >= '0' ) && (atom[3][1] <= '9'))) {
op3 = get_index_of_x_var(atom[3]);
var_abc[op1] = var_x[op2] + var_x[op3];
}
else if(((atom[3][0] >= 'a') && (atom[3][0] <= 'z')) && (atom [3][1] == 0)) {
op3 = atom[3][0] - 'a';
var_abc[op1] = var_x[op2] + var_abc[op3];
}
else if((atom[3][0] >= '0') && (atom[3][0] <= '9')) {
op3_num = strint(atom[3]);
var_abc[op1] = var_x[op2] + op3_num;
}
}
else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
op2 = atom[2][0] - 'a';
if((atom[3][0] == 'x') && ((atom[3][1] >= '0' ) && (atom[3][1] <= '9'))) {
op3 = get_index_of_x_var(atom[3]);
var_abc[op1] = var_abc[op2] + var_x[op3];
}
else if(((atom[3][0] >= 'a') && (atom[3][0] <= 'z')) && (atom [3][1] == 0)) {
op3 = atom[3][0] - 'a';
var_abc[op1] = var_abc[op2] + var_abc[op3];
}
else if((atom[3][0] >= '0') && (atom[3][0] <= '9')) {
op3_num = strint(atom[3]);
var_abc[op1] = var_abc[op2] + op3_num;
}
}
else if((atom[2][0] >= '0') && (atom[2][0] <= '9')) {
op2 = strint(atom[2]);
if((atom[3][0] == 'x') && ((atom[3][1] >= '0' ) && (atom[3][1] <= '9'))) {
op3 = get_index_of_x_var(atom[3]);
var_abc[op1] = op2_num + var_x[op3];
}
else if(((atom[3][0] >= 'a') && (atom[3][0] <= 'z')) && (atom [3][1] == 0)) {
op3 = atom[3][0] - 'a';
var_abc[op1] = op2_num + var_abc[op3];
}
else if((atom[3][0] >= '0') && (atom[3][0] <= '9')) {
op3_num = strint(atom[3]);
var_abc[op1] = op2_num + op3_num;
}
}
}
}
if(strcmp(atom[0], "mul") == 0) {
if((atom[1][0] == 'x') && ((atom[1][1] >= '0' ) && (atom[1][1] <= '9'))) {
op1 = get_index_of_x_var(atom[1]);
if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
op2 = get_index_of_x_var(atom[2]);
if((atom[3][0] == 'x') && ((atom[3][1] >= '0' ) && (atom[3][1] <= '9'))) {
op3 = get_index_of_x_var(atom[3]);
var_x[op1] = var_x[op2] * var_x[op3];
}
else if(((atom[3][0] >= 'a') && (atom[3][0] <= 'z')) && (atom [3][1] == 0)) {
op3 = atom[3][0] - 'a';
var_x[op1] = var_x[op2] * var_abc[op3];
}
else if((atom[3][0] >= '0') && (atom[3][0] <= '9')) {
op3_num = strint(atom[3]);
var_x[op1] = var_x[op2] * op3_num;
}
}
else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
op2 = atom[2][0] - 'a';
if((atom[3][0] == 'x') && ((atom[3][1] >= '0' ) && (atom[3][1] <= '9'))) {
op3 = get_index_of_x_var(atom[3]);
var_x[op1] = var_abc[op2] * var_x[op3];
}
else if(((atom[3][0] >= 'a') && (atom[3][0] <= 'z')) && (atom [3][1] == 0)) {
op3 = atom[3][0] - 'a';
var_x[op1] = var_abc[op2] * var_abc[op3];
}
else if((atom[3][0] >= '0') && (atom[3][0] <= '9')) {
op3_num = strint(atom[3]);
var_x[op1] = var_abc[op2] * op3_num;
}
}
else if(((atom[2][0] >= '0') && (atom[2][0] <= '9'))) {
op2_num = strint(atom[2]);
if((atom[3][0] == 'x') && ((atom[3][1] >= '0' ) && (atom[3][1] <= '9'))) {
op3 = get_index_of_x_var(atom[3]);
var_x[op1] = op2_num * var_x[op3];
}
else if(((atom[3][0] >= 'a') && (atom[3][0] <= 'z')) && (atom [3][1] == 0)) {
op3 = atom[3][0] - 'a';
var_x[op1] = op2_num * var_abc[op3];
}
else if((atom[3][0] >= '0') && (atom[3][0] <= '9')) {
op3_num = strint(atom[3]);
var_x[op1] = op2_num * op3_num;
}
}
}
else if(((atom[1][0] >= 'a') && (atom[1][0] <= 'z')) && (atom [1][1] == 0)) {
op1 = atom[1][0] - 'a';
if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
op2 = get_index_of_x_var(atom[2]);
if((atom[3][0] == 'x') && ((atom[3][1] >= '0' ) && (atom[3][1] <= '9'))) {
op3 = get_index_of_x_var(atom[3]);
var_abc[op1] = var_x[op2] * var_x[op3];
}
else if(((atom[3][0] >= 'a') && (atom[3][0] <= 'z')) && (atom [3][1] == 0)) {
op3 = atom[3][0] - 'a';
var_abc[op1] = var_x[op2] * var_abc[op3];
}
else if((atom[3][0] >= '0') && (atom[3][0] <= '9')) {
op3_num = strint(atom[3]);
var_abc[op1] = var_x[op2] * op3_num;
}
}
else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
op2 = atom[2][0] - 'a';
if((atom[3][0] == 'x') && ((atom[3][1] >= '0' ) && (atom[3][1] <= '9'))) {
op3 = get_index_of_x_var(atom[3]);
var_abc[op1] = var_abc[op2] * var_x[op3];
}
else if(((atom[3][0] >= 'a') && (atom[3][0] <= 'z')) && (atom [3][1] == 0)) {
op3 = atom[3][0] - 'a';
var_abc[op1] = var_abc[op2] * var_abc[op3];
}
else if((atom[3][0] >= '0') && (atom[3][0] <= '9')) {
op3_num = strint(atom[3]);
var_abc[op1] = var_abc[op2] * op3_num;
}
}
else if((atom[2][0] >= '0') && (atom[2][0] <= '9')) {
op2 = strint(atom[2]);
if((atom[3][0] == 'x') && ((atom[3][1] >= '0' ) && (atom[3][1] <= '9'))) {
op3 = get_index_of_x_var(atom[3]);
var_abc[op1] = op2_num * var_x[op3];
}
else if(((atom[3][0] >= 'a') && (atom[3][0] <= 'z')) && (atom [3][1] == 0)) {
op3 = atom[3][0] - 'a';
var_abc[op1] = op2_num * var_abc[op3];
}
else if((atom[3][0] >= '0') && (atom[3][0] <= '9')) {
op3_num = strint(atom[3]);
var_abc[op1] = op2_num * op3_num;
}
}
}
}
if(strcmp(atom[0], "set") == 0) {
if(!(((atom[1][0] >= 'a') && (atom[1][0] <= 'z')) && (atom [1][1] == 0))) {
perror("Virtual Machine: Destination Operand, wrong format");
exit(1);
}
op1 = atom[1][0] - 'a';
if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
op2 = get_index_of_x_var(atom[2]);
var_abc[op1] = var_x[op2];
}
else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
op2 = atom[2][0] - 'a';
var_abc[op1] = var_abc[op2];
}
else if((atom[2][0] >= '0') && (atom[2][0] <= '9')) {
op2 = strint(atom[2]);
var_abc[op1] = op2;
}
}
if(strcmp(atom[0], "print") == 0) {
op1 = atom[1][0] - 'a';
sprintf(str_send_buf, "%i\n", var_abc[op1]);
strcat(send_buf, str_send_buf);
}
if (strcmp(atom[0], "jump") == 0) {
if(strcmp(atom[1], "to") == 0) {
if(strcmp(atom[2], "label") != 0) {
perror("Error in virual code");
exit(1);
}
i = labels[strint(atom[3])];
}
}
if (strcmp(atom[0], "less") == 0) {
if((atom[1][0] == 'x') && ((atom[1][1] >= '0' ) && (atom[1][1] <= '9'))) {
op2 = get_index_of_x_var(atom[1]);
op1_num = var_x[op2];
if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
op3 = get_index_of_x_var(atom[2]);
op2_num = var_x[op3];
}
else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
op3 = atom[2][0] - 'a';
op2_num = var_abc[op3];
}
else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
op3 = strint(atom[2]);
op2_num = op3;
}
}
else if(((atom[1][0] >= 'a') && (atom[1][0] <= 'z')) && (atom [1][1] == 0)) {
op2 = atom[1][0] - 'a';
op1_num = var_abc[op2];
if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
op3 = get_index_of_x_var(atom[2]);
op2_num = var_x[op3];
}
else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
op3 = atom[2][0] - 'a';
op2_num = var_abc[op3];
}
else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
op3 = strint(atom[2]);
op2_num = op3;
}
}
else if((atom[1][0] >= '0') && (atom[1][0] <= '9')) {
op2 = strint(atom[1]);
op1_num = op2;
if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
op3 = get_index_of_x_var(atom[2]);
op2_num = var_x[op3];
}
else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
op3 = atom[2][0] - 'a';
op2_num = var_abc[op3];
}
else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
op3 = strint(atom[2]);
op2_num = op3;
}
}
if(op1_num < op2_num) {
i++;
get_atoms(i);
if(strcmp(atom[0], "to") != 0) {
perror("Error in virtual source code");
exit(1);
}
if(strcmp(atom[1], "label") != 0) {
perror("Error in virtual source code");
exit(1);
}
i = labels[strint(atom[2])];
}
}
if (strcmp(atom[0], "lessequal") == 0) {
if((atom[1][0] == 'x') && ((atom[1][1] >= '0' ) && (atom[1][1] <= '9'))) {
op2 = get_index_of_x_var(atom[1]);
op1_num = var_x[op2];
if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
op3 = get_index_of_x_var(atom[2]);
op2_num = var_x[op3];
}
else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
op3 = atom[2][0] - 'a';
op2_num = var_abc[op3];
}
else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
op3 = strint(atom[2]);
op2_num = op3;
}
}
else if(((atom[1][0] >= 'a') && (atom[1][0] <= 'z')) && (atom [1][1] == 0)) {
op2 = atom[1][0] - 'a';
op1_num = var_abc[op2];
if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
op3 = get_index_of_x_var(atom[2]);
op2_num = var_x[op3];
}
else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
op3 = atom[2][0] - 'a';
op2_num = var_abc[op3];
}
else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
op3 = strint(atom[2]);
op2_num = op3;
}
}
else if((atom[1][0] >= '0') && (atom[1][0] <= '9')) {
op2 = strint(atom[1]);
op1_num = op2;
if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
op3 = get_index_of_x_var(atom[2]);
op2_num = var_x[op3];
}
else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
op3 = atom[2][0] - 'a';
op2_num = var_abc[op3];
}
else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
op3 = strint(atom[2]);
op2_num = op3;
}
}
if(op1_num <= op2_num) {
i++;
get_atoms(i);
if(strcmp(atom[0], "to") != 0) {
perror("Error in virtual source code");
exit(1);
}
if(strcmp(atom[1], "label") != 0) {
perror("Error in virtual source code");
exit(1);
}
i = labels[strint(atom[2])];
}
}
if (strcmp(atom[0], "greater") == 0) {
if((atom[1][0] == 'x') && ((atom[1][1] >= '0' ) && (atom[1][1] <= '9'))) {
op2 = get_index_of_x_var(atom[1]);
op1_num = var_x[op2];
if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
op3 = get_index_of_x_var(atom[2]);
op2_num = var_x[op3];
}
else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
op3 = atom[2][0] - 'a';
op2_num = var_abc[op3];
}
else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
op3 = strint(atom[2]);
op2_num = op3;
}
}
else if(((atom[1][0] >= 'a') && (atom[1][0] <= 'z')) && (atom [1][1] == 0)) {
op2 = atom[1][0] - 'a';
op1_num = var_abc[op2];
if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
op3 = get_index_of_x_var(atom[2]);
op2_num = var_x[op3];
}
else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
op3 = atom[2][0] - 'a';
op2_num = var_abc[op3];
}
else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
op3 = strint(atom[2]);
op2_num = op3;
}
}
else if((atom[1][0] >= '0') && (atom[1][0] <= '9')) {
op2 = strint(atom[1]);
op1_num = op2;
if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
op3 = get_index_of_x_var(atom[2]);
op2_num = var_x[op3];
}
else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
op3 = atom[2][0] - 'a';
op2_num = var_abc[op3];
}
else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
op3 = strint(atom[2]);
op2_num = op3;
}
}
if(op1_num > op2_num) {
i++;
get_atoms(i);
if(strcmp(atom[0], "to") != 0) {
perror("Error in virtual source code");
exit(1);
}
if(strcmp(atom[1], "label") != 0) {
perror("Error in virtual source code");
exit(1);
}
i = labels[strint(atom[2])];
}
}
if (strcmp(atom[0], "greaterequal") == 0) {
if((atom[1][0] == 'x') && ((atom[1][1] >= '0' ) && (atom[1][1] <= '9'))) {
op2 = get_index_of_x_var(atom[1]);
op1_num = var_x[op2];
if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
op3 = get_index_of_x_var(atom[2]);
op2_num = var_x[op3];
}
else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
op3 = atom[2][0] - 'a';
op2_num = var_abc[op3];
}
else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
op3 = strint(atom[2]);
op2_num = op3;
}
}
else if(((atom[1][0] >= 'a') && (atom[1][0] <= 'z')) && (atom [1][1] == 0)) {
op2 = atom[1][0] - 'a';
op1_num = var_abc[op2];
if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
op3 = get_index_of_x_var(atom[2]);
op2_num = var_x[op3];
}
else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
op3 = atom[2][0] - 'a';
op2_num = var_abc[op3];
}
else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
op3 = strint(atom[2]);
op2_num = op3;
}
}
else if((atom[1][0] >= '0') && (atom[1][0] <= '9')) {
op2 = strint(atom[1]);
op1_num = op2;
if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
op3 = get_index_of_x_var(atom[2]);
op2_num = var_x[op3];
}
else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
op3 = atom[2][0] - 'a';
op2_num = var_abc[op3];
}
else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
op3 = strint(atom[2]);
op2_num = op3;
}
}
if(op1_num >= op2_num) {
i++;
get_atoms(i);
if(strcmp(atom[0], "to") != 0) {
perror("Error in virtual source code");
exit(1);
}
if(strcmp(atom[1], "label") != 0) {
perror("Error in virtual source code");
exit(1);
}
i = labels[strint(atom[2])];
}
}
if (strcmp(atom[0], "equal") == 0) {
if((atom[1][0] == 'x') && ((atom[1][1] >= '0' ) && (atom[1][1] <= '9'))) {
op2 = get_index_of_x_var(atom[1]);
op1_num = var_x[op2];
if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
op3 = get_index_of_x_var(atom[2]);
op2_num = var_x[op3];
}
else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
op3 = atom[2][0] - 'a';
op2_num = var_abc[op3];
}
else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
op3 = strint(atom[2]);
op2_num = op3;
}
}
else if(((atom[1][0] >= 'a') && (atom[1][0] <= 'z')) && (atom [1][1] == 0)) {
op2 = atom[1][0] - 'a';
op1_num = var_abc[op2];
if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
op3 = get_index_of_x_var(atom[2]);
op2_num = var_x[op3];
}
else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
op3 = atom[2][0] - 'a';
op2_num = var_abc[op3];
}
else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
op3 = strint(atom[2]);
op2_num = op3;
}
}
else if((atom[1][0] >= '0') && (atom[1][0] <= '9')) {
op2 = strint(atom[1]);
op1_num = op2;
if((atom[2][0] == 'x') && ((atom[2][1] >= '0' ) && (atom[2][1] <= '9'))) {
op3 = get_index_of_x_var(atom[2]);
op2_num = var_x[op3];
}
else if(((atom[2][0] >= 'a') && (atom[2][0] <= 'z')) && (atom [2][1] == 0)) {
op3 = atom[2][0] - 'a';
op2_num = var_abc[op3];
}
else if((atom[2][0] >= '0') && (atom[2][1] <= '9')) {
op3 = strint(atom[2]);
op2_num = op3;
}
}
if(op1_num == op2_num) {
i++;
get_atoms(i);
if(strcmp(atom[0], "to") != 0) {
perror("Error in virtual source code");
exit(1);
}
if(strcmp(atom[1], "label") != 0) {
perror("Error in virtual source code");
exit(1);
}
i = labels[strint(atom[2])];
}
}
}send(sock, send_buf, strlen(send_buf), 0); strcpy(str_send_buf, ""); strcpy(send_buf, "");}
return 0;
}