Семантические действия в синтаксическом анализаторе. Построение дерева программы — различия между версиями
Материал из Вики ИТ мехмата ЮФУ
Admin (обсуждение | вклад) (Новая страница: «==== Модуль узлов синтаксического дерева ==== <source lang="Delphi">unit ProgramTree; uses System.Collections.Generic, SimpleLa…») |
Admin (обсуждение | вклад) (→Модуль узлов синтаксического дерева) |
||
Строка 1: | Строка 1: | ||
+ | [[Страница_курса_%22Методы_построения_компиляторов%22| К основной странице курса]] | ||
+ | |||
+ | Для построения дерева программы создадим модуль, включающий все синтаксические узлы программы | ||
==== Модуль узлов синтаксического дерева ==== | ==== Модуль узлов синтаксического дерева ==== | ||
<source lang="Delphi">unit ProgramTree; | <source lang="Delphi">unit ProgramTree; | ||
Строка 89: | Строка 92: | ||
end.</source> | end.</source> | ||
− | + | ||
+ | '''Задание''' | ||
+ | |||
+ | Добавить семантические действия, строящие дерево программы с корнем root: ProgrNode. Для этого в модуле парсера превратить все процедуры в функции, создающие соответствующие узлы синтаксического дерева |
Версия 08:50, 29 марта 2012
Для построения дерева программы создадим модуль, включающий все синтаксические узлы программы
Модуль узлов синтаксического дерева
unit ProgramTree;
uses
System.Collections.Generic,
SimpleLangLexer;
type
Node = class // базовый класс для всех узлов
end;
ExprNode = class(Node) // базовый класс для всех выражений
end;
IdNode = class(ExprNode)
name: string;
constructor (name: string);
begin
Self.name := name;
end;
end;
NumNode = class(ExprNode)
num: integer;
constructor (num: integer);
begin
Self.num := num;
end;
end;
StatementNode = class(Node) // базовый класс для всех операторов
end;
AssignOpType = lexAssign..lexAssignMult;
AssignNode = class(StatementNode)
id: IdNode;
expr: ExprNode;
assop: AssignOpType;
constructor (id: IdNode; expr: ExprNode; assop: AssignOpType);
begin
Self.id := id;
Self.expr := expr;
Self.assop := assop;
end;
end;
CycleNode = class(StatementNode)
ex: ExprNode;
st: StatementNode;
constructor (ex: ExprNode; st: StatementNode);
begin
Self.ex := ex;
Self.st := st;
end;
end;
StatementList = class
stlist: List<StatementNode>;
constructor ();
begin
stlist := new List<StatementNode>();
end;
constructor (st: StatementNode);
begin
stlist := new List<StatementNode>();
stlist.Add(st);
end;
end;
BlockNode = class(StatementNode)
sl: StatementList;
constructor (sl: StatementList);
begin
Self.sl := sl;
end;
end;
ProgrNode = class(Node)
body: BlockNode;
constructor (body: BlockNode);
begin
Self.body := body;
end;
end;
var root: ProgrNode;
end.
Задание
Добавить семантические действия, строящие дерево программы с корнем root: ProgrNode. Для этого в модуле парсера превратить все процедуры в функции, создающие соответствующие узлы синтаксического дерева