Проверка типа переменной и массива - PullRequest
0 голосов
/ 28 августа 2018

Мне нужно построить компилятор, который переводит язык 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;
   }
  }

Теперь я не могу понять, как я мог реализовать проверку типов на однородность типа элементов массива. Можете мне что-нибудь посоветовать? Должен ли я использовать списки?

Надеюсь, вы мне поможете, большое спасибо!

...