Lang7

Контекст

LANG7

Название языка само по себе не отражает ничего. Язык был разработан летом 2007 году и осенью 2007 же года успешно использован для обучения студентов специальности 010503. Повторно был использован в 2009 году.

На данный момент язык содержит единственный тип данных — число с плавающей запятой и формально является строго статически типизированным. Добавление прочих типов данных не должно существенно повлиять на модель языка.

Синтаксис языка напоминает синтаксис Паскаля.

Транслятор языка на выходе выдаёт программы на Си, Паскале, С#. Многие технологические решения прошлого, будущего и настоящего подразумевают высокоуровневые языки на выходе трансляторов, поэтому данных подход актуален. В будущем планируется выдавать и код для стековой виртуальной машины.

Транслятор представляет собой совокупность библиотек общих интерфейсов и структур данных, которые используются в следующих реализуемых студентами модулях:

  • лексический анализатор (на основе регулярных выражений);
  • синтаксический анализатор класса LL(1);
  • оптимизатор;
  • несколько модулей генерации кода.

Кроме того, для каждого из возможных порождений реализуется небольшая библиотека времени выполнения.

На данный момент проект реализован на платформе .NET 3.5 при помощи языка C# 3.5. Если этого требует учебная программа, он без принципиальных изменений может быть реализован на Java.

Лексика

\s+ разделители

[A-Za-z][A-Za-z\d]* идентификатор или ключевое слово

\d+(\.\d*)?(e-?\d+)? числовая константа

!=|<=|>= сравнение. (возм неоднозн. для разных библ. рег. выр.)

!|,|;|:= разделители и присваивание

\(|\) скобки

\+|\-|\*|/ арифметические операции

<|>|= операции сравнения

#[^#]*# комментарии

Грамматика

// тело программы; EOF - одна из возможных лексем

Program ::= DeclList StmtList EOF

// список объявлений DeclList ::= Decl ? (; Decl)*

// объявление Decl ::= | ProcDecl | FuncDecl | VarDecl

// блок операторов StmtList ::= begin (Stmt;)* Stmt end

// разные операторы Stmt ::= | StmtList | Id ExprList | Id := Expr | return Expr | if Expr then Stmt | if Expr then Stmt else Stmt | while Expr do Stmt | do Expr while Stmt

// объявление переменной VarDecl ::= var Id

// объявление процедуры ProcDecl::= proc Id IdList DeclList StmtList

// объявление функции FuncDecl ::= func Id IdList DeclList StmtList

// список идентификаторов IdList ::= (Id ? (, Id)*)

// список выражений ExprList ::= (Expr ?(, Expr)*)

// выражение Expr ::= | Sum = Sum | Sum < Sum | Sum > Sum | Sum != Sum | Sum <= Sum | Sum >= Sum | Sum

// сумма/разность Sum ::= (Product (+|-))* Product

// произведение/частное Product ::= (Atom (*|/))* Atom

// неразбиваемое выражение Atom ::= | ! Atom | - Atom | (Expr) | Number | Id | ExprList

// [A-Za-z][A-Za-z\d]* -- лексический класс идентификатора или ключевого слова Id

Минимальный набор исходных кодов

Приложенный к странице архив содержит достаточно кода для того, чтобы доделать транслятор, воспользовавшись «скелетом» проекта.