Правки по lab1

This commit is contained in:
2025-04-29 13:13:11 +03:00
parent 3963d304ec
commit 20782a2473
7 changed files with 75 additions and 40 deletions

View File

@@ -2,9 +2,8 @@ import math
import os
from typing import Callable
from prettytable import PrettyTable
from lexer import LexemeType, Lexer
from prettytable import PrettyTable
class IdentifierMapper:
@@ -35,30 +34,34 @@ def exp_form_to_complex(exp_str: str) -> str:
LEXEME_TYPES: dict[str, LexemeType] = {
# 1. Идентификаторы
"IDENTIFIER": LexemeType(
"IDENTIFIER", r"[A-Za-z_][A-Za-z_0-9]{0,15}(?![A-Za-z_0-9])", IdentifierMapper()
"IDENTIFIER", r"[A-Za-z][A-Za-z_0-9]{0,15}(?![A-Za-z_0-9])", IdentifierMapper()
),
# 2. Комплексные числа в показательной форме (на самом деле — числа в экспоненциальной форме)
"COMPLEX": LexemeType(
# "COMPLEX", r"[+-]?\d+(?:\.\d+)?E[+-]?\d+(?!E)", exp_form_to_complex
"COMPLEX",
r"[+-]?\d+(?:\.\d+)?E[+-]?\d+(?:\.\d+)?(?!E)",
r"[+-]?\d+(?:\.\d+)?E[+-]?\d+(?:\.\d+)?",
exp_form_to_complex,
),
# 3. Оператор присваивания :=
"ASSIGN": LexemeType("ASSIGN", r"\:=(?![\:=])"),
"ASSIGN": LexemeType("ASSIGN", r"\:="),
# 4. Арифметические операторы
"ARITHMETIC_OP": LexemeType("ARITHMETIC_OP", r"[+\-*/^]"),
# 5. Скобки
"PAREN": LexemeType("PAREN", r"[()]"),
# 6. Разделитель выражений |
# 5. Левая скобка
"LPAREN": LexemeType("LPAREN", r"\("),
# 6. Правая скобка
"RPAREN": LexemeType("RPAREN", r"\)"),
# 7. Разделитель выражений |
"SEPARATOR": LexemeType("SEPARATOR", r"\|"),
# 7. Комментарии от # до конца строки
# 8. Комментарии от # до конца строки
"COMMENT": LexemeType("COMMENT", r"\#.*"),
}
ERROR_REGEX = r".[^|()+\-*/^:=\s]*"
def analyze_and_print_table(code: str):
lexer = Lexer(LEXEME_TYPES.values())
lexer = Lexer(LEXEME_TYPES.values(), ERROR_REGEX, skip_types=["COMMENT"])
lexemes = lexer.analyze(code)
table = PrettyTable(["Лексема", "Тип лексемы", "Значение"])