Семантические действия в синтаксическом анализаторе. Построение дерева программы — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Новая страница: «==== Модуль узлов синтаксического дерева ==== <source lang="Delphi">unit ProgramTree; uses System.Collections.Generic, SimpleLa…»)
 
(Модуль узлов синтаксического дерева)
Строка 1: Строка 1:
 +
[[Страница_курса_%22Методы_построения_компиляторов%22| К основной странице курса]]
 +
 +
Для построения дерева программы создадим модуль, включающий все синтаксические узлы программы
 
==== Модуль узлов синтаксического дерева ====
 
==== Модуль узлов синтаксического дерева ====
 
<source lang="Delphi">unit ProgramTree;
 
<source lang="Delphi">unit ProgramTree;
Строка 89: Строка 92:
 
end.</source>
 
end.</source>
  
5. Добавить семантические действия, строящие дерево программы с корнем root: ProgrNode
+
 
 +
'''Задание'''
 +
 
 +
Добавить семантические действия, строящие дерево программы с корнем 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. Для этого в модуле парсера превратить все процедуры в функции, создающие соответствующие узлы синтаксического дерева