gram:case-016
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: Лексический анализ
Задачи:
- Распознавание ключевых слов DSL
- Поддержка сложных типов данных
- Обработка модулей и импортов
ЛР2: Синтаксический анализ
Задачи:
- Парсер полной грамматики языка
- Построение AST программы
- Валидация структуры модулей
ЛР3: Семантический анализ
Задачи:
- Проверка типов и областей видимости
- Реализация системы модулей
- Контроль реализации интерфейсов
ЛР4: Генерация кода
Задачи:
- Генерация LLVM IR
- Оптимизация промежуточного кода
- Создание исполняемого файла
Пример программы
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;
}
Педагогическое применение
Использование в школе:
- Изучение принципов создания языков
- Понимание компиляторных технологий
- Разработка специализированных инструментов
← К списку | ← 015 | 017 →
gram/case-016.txt · Last modified: by eugeneai
