Сбор определений классов на лету при разборе

0

В настоящее время я работаю над простым проектом компилятора.

Предположим, что имеется следующая грамматика:

file_input : file_item*
;

file_item : class_def
          | variable_decl
;

class_def : 'class' NAME scope
;

variable_decl : 'dim' NAME 'as' NAME
;

теперь, строя нашу symbol table если мы объявили переменную перед определением класса, мы получим семантическую ошибку, потому что она не найдет класс, необходимый в symbol table

просто нам нужно, чтобы компилятор дождался определения имени класса, поэтому объявление переменной типа foo и определение класса foo позже не помешает компилятору.

любое предложение о том, как этого достичь?

Спасибо за ваше время.

Теги:
parsing
compiler-construction
bison
compilation

2 ответа

1
Лучший ответ

Вам потребуется многопроходный подход:

Сначала пройдите по AST, чтобы создать имена классов сопоставления таблиц для определения класса без каких-либо действий, требующих выполнения поиска в таблице. Затем пройдите второй раз, когда уже построена таблица, и вы сможете зацикливать любой класс, который вам нужен, когда вы столкнетесь с определением переменной.

  • 0
    на самом деле, я думал об этом, но этот способ потребует, читая файл снова, читая те же токены из Lexer, я надеюсь, что есть новый подход для этого, используя 1 проход, заранее спасибо :)
  • 2
    @Maher: Смысл построения AST состоит в том, чтобы больше не читать файл. AST должен содержать всю информацию, необходимую для последующих проходов, организованную в более полезную структуру (дерево или DAG).
1

Один из подходов может заключаться в том, что когда класс foo используется в объявлении переменной, и он еще не существует, немедленно создайте класс foo, но добавьте флаг (что-то вроде "неопределенного") в определение класса. Когда класс будет определен в дальнейшем, обновите определение класса в таблице символов и удалите флаг "undefined".

В конце компиляции просмотрите в таблице символов любые классы, которые по-прежнему помечены как "неопределенные" и сообщают об ошибке. Возможно, было бы полезно записать номер строки для первого использования класса для целей создания отчетов об ошибках.

Это будет работать пока, но позже, когда вы захотите проверить правильность доступа к члену в классе, будет сложно обойтись без полного определения класса. Вы можете сделать то же самое, когда вы отложите разбор доступа к члену до тех пор, пока не получите определение, но в целом я думаю, что это будет сложнее, чем просто многопроходный, как предположил sepp2k.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню