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

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Модуль узлов синтаксического дерева)
(Модуль узлов синтаксического дерева)
Строка 16: Строка 16:
 
   end;
 
   end;
  
   IdNode = class(ExprNode)  
+
   IdNode = class(ExprNode)
 +
  public
 
     name: string;
 
     name: string;
 
     constructor (name: string);
 
     constructor (name: string);
Строка 25: Строка 26:
  
 
   NumNode = class(ExprNode)
 
   NumNode = class(ExprNode)
 +
  public
 
     num: integer;   
 
     num: integer;   
 
     constructor (num: integer);
 
     constructor (num: integer);
Строка 38: Строка 40:
 
    
 
    
 
   AssignNode = class(StatementNode)
 
   AssignNode = class(StatementNode)
 +
  public
 
     id: IdNode;
 
     id: IdNode;
 
     expr: ExprNode;
 
     expr: ExprNode;
Строка 50: Строка 53:
 
    
 
    
 
   CycleNode = class(StatementNode)
 
   CycleNode = class(StatementNode)
 +
  public
 
     ex: ExprNode;
 
     ex: ExprNode;
 
     st: StatementNode;
 
     st: StatementNode;
Строка 60: Строка 64:
  
 
   StatementList = class
 
   StatementList = class
 +
  public
 
     stlist: List<StatementNode>;
 
     stlist: List<StatementNode>;
 
     constructor ();
 
     constructor ();
Строка 68: Строка 73:
 
     begin
 
     begin
 
       stlist := new List<StatementNode>();
 
       stlist := new List<StatementNode>();
 +
      Add(st);
 +
    end;
 +
    procedure Add(st: StatementNode);
 +
    begin
 
       stlist.Add(st);
 
       stlist.Add(st);
 
     end;
 
     end;
Строка 73: Строка 82:
 
    
 
    
 
   BlockNode = class(StatementNode)
 
   BlockNode = class(StatementNode)
 +
  public
 
     sl: StatementList;
 
     sl: StatementList;
 
     constructor (sl: StatementList);
 
     constructor (sl: StatementList);
Строка 81: Строка 91:
 
    
 
    
 
   ProgrNode = class(Node)
 
   ProgrNode = class(Node)
     body: BlockNode;
+
  public
     constructor (body: BlockNode);
+
     body: StatementList;
 +
     constructor (body: StatementList);
 
     begin
 
     begin
 
       Self.body := body;
 
       Self.body := body;

Версия 08:28, 4 апреля 2013

К основной странице курса

Для построения дерева программы создадим модуль, включающий все синтаксические узлы программы

Модуль узлов синтаксического дерева

unit ProgramTree;

uses 
  System.Collections.Generic,
  SimpleLangLexer;
  
type 
  Node = class // базовый класс для всех узлов    
  end;
  
  ExprNode = class(Node) // базовый класс для всех выражений
  end;

  IdNode = class(ExprNode)
  public 
    name: string;
    constructor (name: string);
    begin
      Self.name := name;
    end;
  end;

  NumNode = class(ExprNode)
  public 
    num: integer;  
    constructor (num: integer);
    begin
      Self.num := num;
    end;
  end;
  
  StatementNode = class(Node) // базовый класс для всех операторов
  end;  
  
  AssignOpType = lexAssign..lexAssignMult;
  
  AssignNode = class(StatementNode)
  public 
    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)
  public 
    ex: ExprNode;
    st: StatementNode;
    constructor (ex: ExprNode; st: StatementNode);
    begin
      Self.ex := ex;
      Self.st := st;
    end;
  end;

  StatementList = class
  public 
    stlist: List<StatementNode>;
    constructor ();
    begin
      stlist := new List<StatementNode>();
    end;
    constructor (st: StatementNode);
    begin
      stlist := new List<StatementNode>();
      Add(st);
    end;
    procedure Add(st: StatementNode);
    begin
      stlist.Add(st);
    end;
  end;
  
  BlockNode = class(StatementNode)
  public 
    sl: StatementList;
    constructor (sl: StatementList);
    begin
      Self.sl := sl;
    end;
  end;
  
  ProgrNode = class(Node)
  public 
    body: StatementList;
    constructor (body: StatementList);
    begin
      Self.body := body;
    end;
  end;
  
var root: ProgrNode;
  
end.


Задания

  1. Добавить семантические действия, строящие дерево программы с корнем root: ProgrNode. Для этого в модуле парсера превратить все процедуры в функции, создающие соответствующие узлы синтаксического дерева
  2. Добавить цикл for в грамматику и узел ForNode в модуль узлов синтаксического дерева
  3. Добавить цикл while в грамматику и узел WhileNode в модуль узлов синтаксического дерева
  4. Добавить оператор if в грамматику и узел IfNode в модуль узлов синтаксического дерева (предусмотреть полную и неполную форму)
  5. Добавить грамматику выражений и узел BinaryOperation с параметрами LeftOperand, RightOperand: Expr и OpType: char.
  6. По построенному синтаксическому дереву восстановить текст программы, реализовав в каждом классе синтаксического дерева метод ToString
  7. По построенному синтаксическому дереву написать интерпретатор, реализовав в узлах методы Execute и Evaluate.