===== Кейс 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; } === Педагогическое применение === **Использование в школе:** - Изучение принципов создания языков - Понимание компиляторных технологий - Разработка специализированных инструментов ---- [[gram:labs|← К списку]] | [[gram:case-015|← 015]] | [[gram:case-017|017 →]]