Skip to content

Commit dd12e9f

Browse files
committed
Fix some issues
1 parent a564d51 commit dd12e9f

File tree

7 files changed

+36
-49
lines changed

7 files changed

+36
-49
lines changed

‎compile.sh

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@
88
# How to use ?
99
# 1. Make sure the script has execution permission (+x)
1010
# 2. run the following command:
11-
# ./compile.sh <my_flex_file.lex> <my_syntactic_analyzer_file.c> <my_tab_symbol_file.c> <my_executable_file_name>
11+
# ./compile.sh <my_flex_file.lex> <my_syntactic_analyzer_file.c> <my_tab_symbol_file.c> <my_errors_file.c> <my_executable_file_name>
1212

1313
flex "$1"
1414
gcc -c lex.yy.c
1515
gcc -c "$2"
1616
gcc -c "$3"
17+
gcc -c "$4"
1718
file_name1=$(echo "$2" | cut -d '.' -f 1)
1819
file_name2=$(echo "$3" | cut -d '.' -f 1)
19-
#file_name3=$(echo "$4" | cut -d '.' -f 1)
20-
gcc -o "$4" lex.yy.o "$file_name1.o" "$file_name2.o"
20+
file_name3=$(echo "$4" | cut -d '.' -f 1)
21+
gcc -o "$5" lex.yy.o "$file_name1.o" "$file_name2.o" "$file_name3.o"
2122
rm lex.yy.c *.o

‎error.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ _semantic_error *_create_semantic_error(_semantic_error_type type, int line, cha
1212
_semantic_error *e = (_semantic_error *) malloc(sizeof(_semantic_error));
1313
e->type = type;
1414
e->line = line;
15-
e->name = (char *) malloc(strlen(name) + 1);
15+
e->name = (char *) malloc((strlen(name) + 1) * sizeof(char));
1616
strcpy(e->name, name);
1717
return e;
1818
}
@@ -34,7 +34,7 @@ void _show_semantic_error(_semantic_error *error) {
3434
}
3535

3636
void _show_semantic_errors() {
37-
for(int i = 0; i < _errors_count; i++) {
37+
for (int i = 0; i < _errors_count; i++) {
3838
_show_semantic_error(_errors[i]);
3939
}
4040
}

‎main

42.3 KB
Binary file not shown.

‎syntactical_analyzer.c

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,17 @@ bool _decl_aux() {
108108
var->type = (char *) malloc((strlen(yytext) + 1) * sizeof(char));
109109
strcpy(var->type, yytext);
110110
var->line = yylineno;
111+
if (strcmp(yytext, "Integer") == 0) {
112+
var->value_type = VAR_VALUE_INTEGER;
113+
} else if (strcmp(yytext, "Float") == 0) {
114+
var->value_type = VAR_VALUE_FLOAT;
115+
} else if (strcmp(yytext, "Boolean") == 0) {
116+
var->value_type = VAR_VALUE_BOOLEAN;
117+
} else if (strcmp(yytext, "String") == 0) {
118+
var->value_type = VAR_VALUE_STRING;
119+
} else if (strcmp(yytext, "Character") == 0) {
120+
var->value_type = VAR_VALUE_CHARACTER;
121+
}
111122
if (DEBUG_MODE == true) printf("var_type: %s\n", var->type);
112123
_read_token();
113124
if (_decl_aux_aux()) {
@@ -133,39 +144,27 @@ bool _decl_aux_aux() {
133144
if (DEBUG_MODE == true) printf("var_initialized: %d\n", var->initialized);
134145
_read_token();
135146
if (_const()) {
136-
if (token == STRING_LITERAL || token == CHARACTER_LITERAL) {
137-
var->value.string_value = (char *) malloc((strlen(yytext) - 1) * sizeof(char));
138-
strncpy(var->value.string_value, yytext + 1, strlen(yytext) - 2);
139-
var->value_type = VAR_VALUE_STRING;
140-
if (DEBUG_MODE == true) printf("var_value: %s\n", var->value.string_value);
141-
} else if (token == BOOLEAN_TRUE_VALUE) {
142-
var->value.number_value = 1.0;
143-
var->value_type = VAR_VALUE_BOOLEAN;
144-
if (DEBUG_MODE == true) printf("var_value: %f\n", var->value.number_value);
145-
} else if (token == BOOLEAN_FALSE_VALUE) {
146-
var->value.number_value = 0.0;
147-
var->value_type = VAR_VALUE_BOOLEAN;
148-
if (DEBUG_MODE == true) printf("var_value: %f\n", var->value.number_value);
149-
} else {
150-
var->value.number_value = (float) atof(yytext);
151-
var->value_type = VAR_VALUE_NUMBER;
152-
if (DEBUG_MODE == true) printf("var_value: %f\n", var->value.number_value);
153-
}
147+
if (
148+
(token == CHARACTER_LITERAL && var->value_type != VAR_VALUE_CHARACTER) ||
149+
(token == STRING_LITERAL && var->value_type != VAR_VALUE_STRING) ||
150+
(token == INTEGER_VALUE && var->value_type != VAR_VALUE_INTEGER) ||
151+
(token == FLOAT_VALUE && var->value_type != VAR_VALUE_FLOAT) ||
152+
((token == BOOLEAN_TRUE_VALUE || token == BOOLEAN_FALSE_VALUE) && var->value_type != VAR_VALUE_BOOLEAN)
153+
) {
154+
_add_semantic_error(BADLY_INITIALIZED, var->line, var->name);
155+
}
154156
_read_token();
155157
if (token == DELIMITER_SEMICOLON) {
156158
if (_add_var_to_tab_symbol(var) == false) {
157-
_add_semantic_error(ALREADY_DECLARED,var->line,var->name);
158-
};
159-
if(_check_value_type(var->value_type,var->value) == false){
160-
_add_semantic_error(BADLY_INITIALIZED,var->line,var->name);
159+
_add_semantic_error(ALREADY_DECLARED, var->line, var->name);
161160
};
162161
result = true;
163162
}
164163
}
165164
} else if (token == DELIMITER_SEMICOLON) {
166165
var->initialized = false;
167166
if (_add_var_to_tab_symbol(var) == false) {
168-
_add_semantic_error(ALREADY_DECLARED,var->line,var->name);
167+
_add_semantic_error(ALREADY_DECLARED, var->line, var->name);
169168
};
170169
result = true;
171170
}

‎tab_symb.c

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -40,21 +40,6 @@ bool _in_tab_symbol(char *name) {
4040
return result;
4141
}
4242

43-
bool _check_value_type(_var_value_type value_type, _var_value value){
44-
bool result = false;
45-
if(value_type == VAR_VALUE_NUMBER && value.number_value == INTEGER_VALUE)
46-
result = true;
47-
else if(value_type == VAR_VALUE_NUMBER && value.number_value == FLOAT_VALUE)
48-
result = true;
49-
else if(value_type == VAR_VALUE_BOOLEAN && value.number_value == BOOLEAN_TRUE_VALUE || value.number_value == BOOLEAN_FALSE_VALUE)
50-
result = true;
51-
else if(value_type == VAR_VALUE_STRING && value.string_value == "STRING_LITERAL")
52-
result = true;
53-
else if(value_type == VAR_VALUE_CHARACTER && value.string_value == "CHARACTER_LITERAL")
54-
result = true;
55-
return result;
56-
}
57-
5843
void _reset_tab_symbol() {
5944
memset(_tab_symbol, 0, sizeof(_tab_symbol));
6045
_var_count = 0;
@@ -67,6 +52,7 @@ void _print_tab_symbol() {
6752
printf(", ");
6853
}
6954
printf("{\n");
55+
printf(" line: %d,\n", _tab_symbol[i]->line);
7056
printf(" name: %s,\n", _tab_symbol[i]->name);
7157
printf(" type: %s,\n", _tab_symbol[i]->type);
7258
printf(" initialized: %d", _tab_symbol[i]->initialized);
@@ -77,9 +63,11 @@ void _print_tab_symbol() {
7763
printf(" value: %s\n", _tab_symbol[i]->value.number_value == 1.0 ? "true" : "false");
7864
break;
7965
case VAR_VALUE_STRING:
66+
case VAR_VALUE_CHARACTER:
8067
printf(" value: %s\n", _tab_symbol[i]->value.string_value);
8168
break;
82-
case VAR_VALUE_NUMBER:
69+
case VAR_VALUE_FLOAT:
70+
case VAR_VALUE_INTEGER:
8371
printf(" value: %f\n", _tab_symbol[i]->value.number_value);
8472
break;
8573
}

‎tab_symb.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22
#define TAB_SYMB_H
33

44
typedef enum {
5-
VAR_VALUE_NUMBER,
5+
VAR_VALUE_INTEGER,
6+
VAR_VALUE_FLOAT,
67
VAR_VALUE_BOOLEAN,
78
VAR_VALUE_STRING,
8-
CHARACTER_LITERAL
9+
VAR_VALUE_CHARACTER
910
} _var_value_type;
1011

1112
typedef union {
@@ -28,8 +29,6 @@ bool _add_var_to_tab_symbol(_var_info *var);
2829

2930
bool _in_tab_symbol(char *name);
3031

31-
bool _check_value_type(_var_value_type value_type, _var_value value);
32-
3332
void _reset_tab_symbol();
3433

3534
void _print_tab_symbol();

‎test samples/loop_statement_test.adb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ test2:Float :=50.1;
55
test2:Character :='A';
66
test2:String :="OMG";
77
test2:Boolean :=true;
8-
test2:Boolean :=false;
8+
test2:Boolean := "Hi";
99

1010
test3:Integer;
1111
test3:Float;

0 commit comments

Comments
 (0)