Как пишется компилятор?
Необходимо написать интерпретатор языка.
Посоветуйте, пожалуйста, с чего начать.
Подскажите какие в этой задаче этапы. И как их можно осуществить.
Здравствуйте.
Необходимо написать интерпретатор языка.
Посоветуйте, пожалуйста, с чего начать.
Подскажите какие в этой задаче этапы. И как их можно осуществить.
Этапы следующие:
лексический анализатор - для разбиения текста программы на лексемы (ключевые слова, идентификаторы, операторы и т.п.);
синтаксический анализатор - он работает в паре с лексическим и проверяет на правильность лексемы;
семантический анализатор - он проверяет уже правильность построения из лексем конструкций языка.
Этапы следующие:
лексический анализатор - для разбиения текста программы на лексемы (ключевые слова, идентификаторы, операторы и т.п.);
синтаксический анализатор - он работает в паре с лексическим и проверяет на правильность лексемы;
семантический анализатор - он проверяет уже правильность построения из лексем конструкций языка.
Ну это немного понятно. Хотелось бы узнать более подробно.
Лексический анализатор - как я понимаю для выделения лексемы (например ключевого слова), его надо где-нибудь хранить. Например, в массиве. Так?
Дальше, если слово (лексема) не ключевое слово, то, скорее всего, это идентификатор (или имя процедуры). Иначе - синтаксическая ошибка. Правильно?
Если идентификатор - то его надо где-нибудь хранить. Например, в динамическом списке, у которого полями являются название, тип, значение.
Вот у меня какой вопрос тогда появляется одним из первых: Какую структуру данных организовать для хранения идентификатора.
Я предполагаю, что у нас поле name имеет тип string, type - Pointer, которому будем присваивать указатели на различные типы. Например, type := PInteger;
Соответственно значение идентификатора должно храниться по адресу type^
Правильно? Или я ошибаюсь?
Для начала хотелось бы прояснить эти вопросы...
Фу-у-у. Сам еле понял что написал... :-)
Ну это немного понятно. Хотелось бы узнать более подробно.
Лексический анализатор - как я понимаю для выделения лексемы (например ключевого слова), его надо где-нибудь хранить. Например, в массиве. Так?
Дальше, если слово (лексема) не ключевое слово, то, скорее всего, это идентификатор (или имя процедуры). Иначе - синтаксическая ошибка. Правильно?
Если идентификатор - то его надо где-нибудь хранить. Например, в динамическом списке, у которого полями являются название, тип, значение.
Вот у меня какой вопрос тогда появляется одним из первых: Какую структуру данных организовать для хранения идентификатора.
Я предполагаю, что у нас поле name имеет тип string, type - Pointer, которому будем присваивать указатели на различные типы. Например, type := PInteger;
Соответственно значение идентификатора должно храниться по адресу type^
Правильно? Или я ошибаюсь?
Для начала хотелось бы прояснить эти вопросы...
Фу-у-у. Сам еле понял что написал... :-)
Думаю, тема слишком обширная, чтобы все тут пояснить %)
Вот ссылка на неплохую статью
http://www.cast.h1.ru/Articles/compiler_writes_as.shtml
Можешь сам еще в инете поискать.
(Жаль, что по мылу нельзя реальные книги посылать, а то нас в универе препод учила по своей книжке на эту тему - там все было разжевано ;)