вычисления значения нетерминальных токенов? Или это происходит в рамках какой-то стадии?
Вот предположим есть стадия (вероятно её следует назвать стадия лексического анализа?), на которой исходный код разбивается на массив токенов типо {kind, start_pos, end_pos}. В рамках следующей стадии и должно происходить вычисление значений нетерминальных токенов? Или же стадия лексического анализа уже должна была эти значения вычислить (а когда? В конце просто пройтись по уже готовому списку токенов или же «одновременно» с парсингом нетерминального токена)?
А что такое "значение нетерминального токена"?
Токены, по типу которых нельзя однозначно определить какой последовательностью символов они были заданы в исходном тексте, называются нетерминальным, правильно? Тогда такие токены — это например строковые, числовые и символьные (мм, я имел ввиду идентификаторы, но один символ тоже ведь такой) литералы. Вот, например для строкового литерала "z\x01z" значением будет массив байт 7A 01 7A (надеюсь не напутал😊)
> Токены, по типу которых нельзя однозначно определить какой последовательностью символов они были заданы в исходном тексте, называются нетерминальным, правильно? Нет, это что-то совершенно из другой области... Я вообще пока не понимаю, о чём Вы спрашиваете и какую проблему пытаетесь решить...
1. Ох, извиняюсь. А есть термин для такого подмножества токенов? (по одному лишь типу которых нельзя однозначно определить какой последовательностью символов они были заданы в исходном коде) 2. Пытаюсь разобраться в стадиях фронтенда. Вот первая стадия это вроде как стадия лексического анализа, которая разбивает исходный код на последовательность токенов. То есть, что-то {token_kind, start_pos, end_pos}. Потом, вероятно, идёт стадия синтаксического анализа. Ей «значения токенов» не нужны скорее всего, так? А на какой стадии происходит вычисление этих «значений токенов»? Ведь рано или поздно нужно будет знать, какой именно идентификатор используется, какая именно строка, какое именно число обозначено тем или иным токеном. 3. Кстати, а может для «значений токенов» тоже есть термин?
После лексера идёт парсер, ему-то как раз значения нужны, чтобы было из чего AST строить.
Нетерминалы — это конструкции в грамматике. Терминалы — это отдельные токены.
есть строчка "1 + 2" ну вот тебе лексер выдал lex : string -> stream(token) [ {{int, 1}, 0, 1}, {plus, 2, 3}, {{int, 2}, 4, 5} ] парсер это превратил в конкретное синтаксическое дерево parse : steam(token) -> tree(token) {plus, 2, 3, {{int, 1}, 0, 1}, {{int, 2}, 4, 5}} которое потом можно превратиться в другое уже абстраткное дерево, с которым уже работает бэк, например такая трансформация, которая все операторы объединяет abstract : tree(token) -> AST {op, plus, 2, 3, {{int, 1}, 0, 1}, {{int, 2}, 4, 5}} никаких значений токенов в результате не появилось
У меня лексер по-другому работает: lex : string -> stream(token), где token это {token_kind, token_start, token_end}. Следственно, для примера "1 + 2" я получу что-то типо этого: [ {INT, 0, 1}, {PLUS, 2, 3}, {INT, 4, 5} // ну и еще EOL или EOI токен тут будет ]
ну так у меня такой же лексер, только ты в токенах потерял информацию важную
Обсуждают сегодня