Архив‎ > ‎

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

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

Приложенный к странице архив содержит достаточно кода для того, чтобы доделать транслятор, воспользовавшись «скелетом» проекта.
ċ
Lang7-2010.7z
(15k)
Dmitry Luciv,
25 апр. 2011 г., 4:49
Comments