Таблица символов и семантический анализ для компилятора - PullRequest
2 голосов
/ 26 января 2011

Я работаю над созданием компилятора (без использования каких-либо инструментов, подобных lex или bison) для языка, подобного C (более простого), и уже прошел через лексер и парсер.Я не уверен, что мой анализатор работает правильно или нет.Поскольку до сих пор для анализа, т. Е. Для проверки правильности синтаксиса, я вообще не использовал связанные списки.По сути, мой синтаксический анализатор выглядит следующим образом: предположим, что синтаксис -

<program> ::= <program_header> <program_body>
<program_header>::= program <identifier> is
<program_body> ::= (<declaration>;)*
begin
(<statement>;)*
end program

Моя программа выглядит так:

parser()
{
char *next_token;
next_token = get_token();
check_for_program(next_token);
}
check_for_program(next_token)
{
check_for_program_header(next_token);
if (header_found)
check_for_program_body();
}...

У меня в основном есть функции для всех нетерминалов, и я вызываю ихв соответствующее время, и я проверяю ключевые слова по "strcmp".Этот метод в порядке?

С этого момента, как проводить семантический анализ?С чего мне начать строить таблицу символов?

Любое предложение или указатель на мысль, что это здорово!Большое спасибо

Ответы [ 2 ]

3 голосов
/ 26 января 2011

Ну, обычный и довольно простой способ сделать это - создать парсер рекурсивного спуска, то есть создать функции, которые соответствуют вашему синтаксису (который вы вроде как уже начали делать):

, например

<program> ::= <program_header> <program_body>
<program_header>::= program <identifier> is
<program_body> ::= (<declaration>;)*

будет соответствовать чему-то вроде

void program()
{
  program_header();
  program_body();
}

void program_header() 
{
   char* program_token = get_token();
   char* identifier = get_token();
   if (identifier==NULL) report_error();
   ...
}

void program_body()
{
   declaration();
   ...
}

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

0 голосов
/ 26 января 2011

Да, это один из способов анализа, он называется Парсер рекурсивного спуска . Это неофициальный способ синтаксического анализа, это означает, что вам потребуется изменить код синтаксического анализа, если вы измените грамматику.

Существуют также формальные методы синтаксического анализа, такие как LL и SLR , формальные методы имеют два преимущества: вы можете доказать, что синтаксический анализ разбирает то, что определяется вашей грамматикой они называются формальными), и они являются общими, вы можете кодировать один раз и анализировать любые совместимые грамматики.

...