CC S01E01

Sept. 25, 2013, 7:56 p.m.

Введение

План на семестр, Литература

Email рассылка: https://groups.google.com/forum/#!forum/usu_cc

Требования

  • В конце каждого занятия формулируется домашнее задание.
  • Сдавшие задание к следующему занятию получают 5 баллов, через одно - 4 балла,
  • через 2 - 3 и так далее.
  • Получившие 80% - 100% от максимального возможного балла получают отлично, 60% - 79% - хорошо, 40% - 59% - удовлетворительно или зачтено.

Этапы работы компилятора

  • Лексический анализ (Lexer) -> поток токенов
  • Синтаксический анализ (Parser) -> дерево разбора (parse tree)
  • Семантический анализ -> построение AST, различные проверки
  • Генерация кода -> ассемблерный код -> исполняемый модуль

ANTLRWorks

Построение лексического анализатора

INT : [0-9]+;
WS  : [ \t\r\n]+ -> skip;
ID  : [a-zA-Z_][a-zA-Z_0-9]*;

PLUS  : '+';
MINUS : '-';
MULT  : '*';
DIV   : '/';
LPAR  : '(';
RPAR  : ')';

Построение грамматики и синтаксического анализатора

Пример 1

Обращаем внимание на порядок, чтобы дерево разбора было разумным

expr
    : expr MULT expr
    | expr PLUS expr
    | INT
    ;

Пример 2

Без левой рекурсии (для общего образования)

input
    : expr EOF
    ;

expr
    : term ((PLUS | MINUS) term)*
    ;

term
    : factor ((MULT | DIV) factor)*
    ;

factor
    : (PLUS | MINUS) factor
    | atom
    ;

atom
    : INT
    | LPAR expr RPAR
    ;

Домашнее задание

Создать combined grammar для арифметических выражений с +, -, *, /, скобками, возведением в степень, унарный минусом, double и символьными константами PI и E.

comments powered by Disqus