Зачем он нужен: презентация
Ближайшие «родственники» (более продвинутые)
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
Приложенный к странице архив содержит достаточно кода для того, чтобы доделать транслятор, воспользовавшись «скелетом» проекта.