грамматика парсится ?я так понимаю, анализ кода нужно пихать в лексер ( из строчки "class A(object): pass" он отдаст "CLS A LPAREN object Rparen col pass"), дальше идет парсер, который составляет ast (из "CLS..." получится дерево с распарашенной грамматикой "CLS A наследуетсяот object иделает pass"). Компилятор гонит это дело в определенный формат.
все так?
А ты не хочешь flex + bison потыкать?
я думал об этом. решил все с нуля писать,чтобы основы подтянуть. да и язык не сложный вроде
есть миллион статей по написанию рекурсивного парсера руками
Попробуй хотя бы написать какой-нибудь однопроходный компилятор для сишки чтоли. Она под это и создавалась.
лучше тогда не сишку, а какой-то ещё более простой язык
почему у вас меняется цвет аватарки?
не хочу ныть , но дайте пжлста чать🥺
что значит "однопроходный"?
рано в чат с такими вопросами
Лексер превращает поток символов в поток токенов. Парсер превращает поток символов в синтаксическое дерево в соответствии с грамматикой. Дальше есть много вариантов: а) интерпретатор работает напрямую с деревом; б) дерево компилируется в байт-код; в) дерево оптимизируется и компилируется в байт-код; ... Например: Lexer: "1 + 2 * 3" -> [Integer "1", Infix "+", Integer "2", Infix "*", Integer "3"] Parser: [Integer "1", Infix "+", Integer "2", Infix "*", Integer "3"] -> Add(Int(1), Mul(Int(2), Int(3))) Interpreter: Add(Int(1), Mul(Int(2), Int(3))) -> 7 Синтаксическое дерево может создаваться, а может и не создаваться. Если хочется поковыряться с парсингом, попробуй lark https://github.com/lark-parser/lark
то есть грамматику начинают анализировать на этапе парсера. на этапе лексера мы только обрабатываем символы и ищем что они значат. Понял, Всем спасибо!
а нормально ли оптимизировать на всех этапах?
Обсуждают сегодня