Мне нужно построить компилятор, который переводит язык Java в Pyhton. Я использую инструменты Flex и Bison. Я создал гибкий файл и определил синтаксическую грамматику в Bison для некоторых ограничений, которые я должен реализовать (например, массив, управление циклами, управление классом, управление логико-арифметическими операторами и т. Д.). В семантическом анализе у меня есть проблема с проверкой типа переменной и массива. Я использую таблицу символов, созданную с помощью библиотеки Uthash. Это структура таблицы символов в модуле symboltable.h:
struct symtable{
char *scopename; // key
struct symtable2 *subtable; // symble table secondary
UT_hash_handle hh; // to make the structure hash
}
struct symtable2 // secondary symbol structure
{
char *name; // Name of the symbol (key)
char *element; // it can be a variable or an array
char *type; // Indicates the type assumed by the token (int, float, char, bool)
char *value; // value assigned to the variable
int dim; // Array size, it is zero in the case of a variable.
UT_hash_handle hh; // to make the structure hash
};
Я пытался управлять проверкой типов между переменными с помощью этой функции, присутствующей в парсере, но у меня нет способа проверить правильность:
int typeChecking (variable1, variable2) {
struct symtable2 *s2;
s2=find_symbol (scopename, variable1);
if (s2!=NULL) {
int type1= s2->type;
char element1 = s2->element;
}
else{
printf("\n\n\033[01;31mVariable 1 not defined.\033[00m\n");
return -1;
}
s2=find_symbol (scopename, variable2);
if (s2!=NULL) {
int type2= s2->type;
char element2 = s2->element;
}
else{
printf("\n\n\033[01;31mVariable 2 not defined.\033[00m\n");
return -1;
}
if(element1=='variable' && element2=='variable'){
if (type1 == type2){
return 0;
}
else {
return 1;
}
}
else {
printf("\n\n\033[01;31m Different elements.\033[00m\n");
return -1;
}
}
Теперь я не могу понять, как я мог реализовать проверку типов на однородность типа элементов массива.
Можете мне что-нибудь посоветовать? Должен ли я использовать списки?
Надеюсь, вы мне поможете, большое спасибо!