185 похожих чатов

Прошу прощение, что вопрос снова про фронтенд. На какой стадии происходит

вычисления значения нетерминальных токенов? Или это происходит в рамках какой-то стадии?

Вот предположим есть стадия (вероятно её следует назвать стадия лексического анализа?), на которой исходный код разбивается на массив токенов типо {kind, start_pos, end_pos}. В рамках следующей стадии и должно происходить вычисление значений нетерминальных токенов? Или же стадия лексического анализа уже должна была эти значения вычислить (а когда? В конце просто пройтись по уже готовому списку токенов или же «одновременно» с парсингом нетерминального токена)?

9 ответов

20 просмотров

А что такое "значение нетерминального токена"?

Miroslav-Belov Автор вопроса
Alexander Chichigin
А что такое "значение нетерминального токена"?

Токены, по типу которых нельзя однозначно определить какой последовательностью символов они были заданы в исходном тексте, называются нетерминальным, правильно? Тогда такие токены — это например строковые, числовые и символьные (мм, я имел ввиду идентификаторы, но один символ тоже ведь такой) литералы. Вот, например для строкового литерала "z\x01z" значением будет массив байт 7A 01 7A (надеюсь не напутал😊)

> Токены, по типу которых нельзя однозначно определить какой последовательностью символов они были заданы в исходном тексте, называются нетерминальным, правильно? Нет, это что-то совершенно из другой области... Я вообще пока не понимаю, о чём Вы спрашиваете и какую проблему пытаетесь решить...

Miroslav-Belov Автор вопроса
Alexander Chichigin
> Токены, по типу которых нельзя однозначно опреде...

1. Ох, извиняюсь. А есть термин для такого подмножества токенов? (по одному лишь типу которых нельзя однозначно определить какой последовательностью символов они были заданы в исходном коде) 2. Пытаюсь разобраться в стадиях фронтенда. Вот первая стадия это вроде как стадия лексического анализа, которая разбивает исходный код на последовательность токенов. То есть, что-то {token_kind, start_pos, end_pos}. Потом, вероятно, идёт стадия синтаксического анализа. Ей «значения токенов» не нужны скорее всего, так? А на какой стадии происходит вычисление этих «значений токенов»? Ведь рано или поздно нужно будет знать, какой именно идентификатор используется, какая именно строка, какое именно число обозначено тем или иным токеном. 3. Кстати, а может для «значений токенов» тоже есть термин?

Miroslav Belov
1. Ох, извиняюсь. А есть термин для такого подмнож...

После лексера идёт парсер, ему-то как раз значения нужны, чтобы было из чего AST строить.

Miroslav Belov
Токены, по типу которых нельзя однозначно определи...

Нетерминалы — это конструкции в грамматике. Терминалы — это отдельные токены.

есть строчка "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}} никаких значений токенов в результате не появилось

Miroslav-Belov Автор вопроса
кана
есть строчка "1 + 2" ну вот тебе лексер выдал le...

У меня лексер по-другому работает: lex : string -> stream(token), где token это {token_kind, token_start, token_end}. Следственно, для примера "1 + 2" я получу что-то типо этого: [ {INT, 0, 1}, {PLUS, 2, 3}, {INT, 4, 5} // ну и еще EOL или EOI токен тут будет ]

Miroslav Belov
У меня лексер по-другому работает: lex : string ->...

ну так у меня такой же лексер, только ты в токенах потерял информацию важную

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
5
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Карта сайта