Table of Contents

Кейс 016: Domain-Specific Language (gram:case-016)

Общая информация

Уровень сложности 🔴 Экспертный
Рекомендуемые языки Java, C++
Основные инструменты ANTLR4, LLVM
Предметная область Информатика, языки программирования

Описание кейса

Разработка предметно-ориентированного языка для специфической области с полным циклом от грамматики до генерации эффективного кода.

Грамматика языка

// Лексемы
MODULE     : 'module'
IMPORT     : 'import'
DEF        : 'def'
RETURN     : 'return'
IF         : 'if'
ELSE       : 'else'
WHILE      : 'while'
FOR        : 'for'
IN         : 'in'
VAR        : 'var'
CONST      : 'const'
TYPE       : 'type'
STRUCT     : 'struct'
INTERFACE  : 'interface'
IMPLEMENTS : 'implements'
LBRACE     : '{'
RBRACE     : '}'
LPAREN     : '('
RPAREN     : ')'
COLON      : ':'
SEMI       : ';'
COMMA      : ','
ASSIGN     : '='
ARROW      : '->'
STRING     : '"' (~["\\] | '\\' .)* '"'
NUMBER     : [0-9]+ ('.' [0-9]+)?
ID         : [a-zA-Z_][a-zA-Z_0-9]*
WS         : [ \t\r\n]+ -> skip

// Синтаксис
program     : module_decl import_decl* definition*
module_decl : MODULE ID
import_decl : IMPORT STRING

definition  : function_def | struct_def | interface_def
function_def: DEF ID LPAREN params? RPAREN (ARROW type)? block
struct_def  : STRUCT ID LBRACE field* RBRACE
interface_def: INTERFACE ID LBRACE method_sig* RBRACE

params      : param (COMMA param)*
param       : ID COLON type
field       : ID COLON type SEMI
method_sig  : ID LPAREN params? RPAREN (ARROW type)? SEMI

type        : basic_type | struct_type | array_type
basic_type  : 'int' | 'float' | 'bool' | 'string'
struct_type : ID
array_type  : type LBRACKET RBRACKET

block       : LBRACE statement* RBRACE
statement   : var_decl | assignment | if_stmt | while_stmt | for_stmt | return_stmt | expr SEMI

var_decl    : (VAR | CONST) ID (COLON type)? (ASSIGN expr)? SEMI
assignment  : ID ASSIGN expr SEMI
if_stmt     : IF expr block (ELSE block)?
while_stmt  : WHILE expr block
for_stmt    : FOR ID IN expr block
return_stmt : RETURN expr? SEMI

expr        : logic_or
logic_or    : logic_and (OR logic_and)*
logic_and   : equality (AND equality)*
equality    : comparison ((EQ | NEQ) comparison)*
comparison  : term ((LT | GT | LEQ | GEQ) term)*
term        : factor ((PLUS | MINUS) factor)*
factor      : unary ((MUL | DIV) unary)*
unary       : (NOT | MINUS)? primary
primary     : literal | ID | call_expr | field_access | LPAREN expr RPAREN

literal     : NUMBER | STRING | TRUE | FALSE
call_expr   : ID LPAREN (expr (COMMA expr)*)? RPAREN
field_access: primary '.' ID

План лабораторных работ

ЛР1: Лексический анализ

Задачи:

  1. Распознавание ключевых слов DSL
  2. Поддержка сложных типов данных
  3. Обработка модулей и импортов

ЛР2: Синтаксический анализ

Задачи:

  1. Парсер полной грамматики языка
  2. Построение AST программы
  3. Валидация структуры модулей

ЛР3: Семантический анализ

Задачи:

  1. Проверка типов и областей видимости
  2. Реализация системы модулей
  3. Контроль реализации интерфейсов

ЛР4: Генерация кода

Задачи:

  1. Генерация LLVM IR
  2. Оптимизация промежуточного кода
  3. Создание исполняемого файла

Пример программы

module math_utils

import "standard_lib"

type Vector struct {
    x: float;
    y: float;
}

def length(v: Vector) -> float {
    return sqrt(v.x*v.x + v.y*v.y);
}

def main() -> int {
    var v = Vector { x: 3.0, y: 4.0 };
    const l = length(v);
    print(l);
    return 0;
}

Педагогическое применение

Использование в школе:

  1. Изучение принципов создания языков
  2. Понимание компиляторных технологий
  3. Разработка специализированных инструментов

← К списку | ← 015 | 017 →