Size: a a a

Compiler Development

2020 December 12

BD

Berkus Decker in Compiler Development
for(int c; (c = getchar()) != EOF;)
У меня есть конкретное дерево разбора для кода (CST), и соответствующее ему абстрактное (AST), полученное из первого просто выбрасыванием всех вспомогательных токенов.

Мне нужно сделать обратное преобразование - имея AST по нему добавить недостающие токены (и потом в собрать это все обратно в строку). Самый простой вариант это реализовать - написать вручную куда и при каких условиях что нужно добавить, но это достаточно мутный процесс.

У меня была идея распарсить какое-то количество тестового кода, собрать статистику по тому где какие вспомогательные токены встречаются, и на основе этого сгенерировать код для преобразователя из AST в CST. Возможно с какими-то ручными изменениями после.

Может быть кто-то встречал что-то похожее и может порекомендовать какие-то статьи на эту тему? Если честно то у меня не очень получилось даже загуглить это, но может быть я не смог сформулировать.
как восстановить информацию, которую вы только что выкинули - довольно несложная проблема, как только ее решите, всё будет!
источник

f

for(int c; (c = getc... in Compiler Development
Да, конкретно комментарии вставить невозможно, но я имею ввиду вещи типа for в которых есть пунктация пачками, - ():

Например если есть такой код:

  echo(12, 2)


И он дает условное

: StmtList
:   Call
:     Ident "echo"
:     IntLit 12
:     IntLit 2


То мне нужно просто определить что Call выгдядит как `Call "(" <arg1> ",  " <arg2> ")" например
источник

f

for(int c; (c = getc... in Compiler Development
Berkus Decker
как восстановить информацию, которую вы только что выкинули - довольно несложная проблема, как только ее решите, всё будет!
И я криво сформулирован - мне нужно просто сгенерировать корретное CST из AST которое мне дано, я не выкидываю ничего
источник

BD

Berkus Decker in Compiler Development
может он выглядит как

echo
(
1,2)
источник

PS

Pavel Samolysov in Compiler Development
for(int c; (c = getchar()) != EOF;)
У меня есть конкретное дерево разбора для кода (CST), и соответствующее ему абстрактное (AST), полученное из первого просто выбрасыванием всех вспомогательных токенов.

Мне нужно сделать обратное преобразование - имея AST по нему добавить недостающие токены (и потом в собрать это все обратно в строку). Самый простой вариант это реализовать - написать вручную куда и при каких условиях что нужно добавить, но это достаточно мутный процесс.

У меня была идея распарсить какое-то количество тестового кода, собрать статистику по тому где какие вспомогательные токены встречаются, и на основе этого сгенерировать код для преобразователя из AST в CST. Возможно с какими-то ручными изменениями после.

Может быть кто-то встречал что-то похожее и может порекомендовать какие-то статьи на эту тему? Если честно то у меня не очень получилось даже загуглить это, но может быть я не смог сформулировать.
Интересен процесс получения  AST из CST. Вы это делаете сразу при парсинге или отдельным проходом? Если отдельным, то выбрасываете ли помимо токенов ещё и промежуточные узлы дерева?
источник

f

for(int c; (c = getc... in Compiler Development
Berkus Decker
может он выглядит как

echo
(
1,2)
Это уже конкретная строка для кода, меня все же интересует дерево разбора, в котором просто вернули вспомогательные токены. Так что

echo (1,                2) == echo(1, 2)

Но

echo 1, 2 ! = echo(1, 2)
источник

BD

Berkus Decker in Compiler Development
for(int c; (c = getchar()) != EOF;)
Это уже конкретная строка для кода, меня все же интересует дерево разбора, в котором просто вернули вспомогательные токены. Так что

echo (1,                2) == echo(1, 2)

Но

echo 1, 2 ! = echo(1, 2)
ну если они в дереве разными структурами представлены то вы их сможете по разному отрендерить, а если одинаковыми - то не сможете
источник

BD

Berkus Decker in Compiler Development
вопрос в том во что парсится echo 1,2
источник

f

for(int c; (c = getc... in Compiler Development
Pavel Samolysov
Интересен процесс получения  AST из CST. Вы это делаете сразу при парсинге или отдельным проходом? Если отдельным, то выбрасываете ли помимо токенов ещё и промежуточные узлы дерева?
Отдельным проходом, выкидываются только те узлы которые представляют из себя вспомогательные токены (наподобие (),)
источник

PS

Pavel Samolysov in Compiler Development
for(int c; (c = getchar()) != EOF;)
Отдельным проходом, выкидываются только те узлы которые представляют из себя вспомогательные токены (наподобие (),)
А понятно. Просто думал как выкидывать промежуточные узлы если ещё пока не известно сколько их надо выкинуть. Пока остановился на идее выкидывать по одному за несколько проходов.
источник

f

for(int c; (c = getc... in Compiler Development
Pavel Samolysov
Интересен процесс получения  AST из CST. Вы это делаете сразу при парсинге или отдельным проходом? Если отдельным, то выбрасываете ли помимо токенов ещё и промежуточные узлы дерева?
Исходный код - int main() {}

Конкретное дерево разбора

TranslationUnit
 FunctionDefinition
   PrimitiveType int
   FunctionDeclarator
     Identifier main
     ParameterList
       SingleLParTok (
       SingleRParTok )
   CompoundStatement
     SingleLCurlyTok {
     SingleRCurlyTok }


После фильтрации всех вспомогательных токенов (*Tok) ноды

TranslationUnit
 FunctionDefinition
   PrimitiveType int
   FunctionDeclarator
     Identifier main
     ParameterList ()
   CompoundStatement {}
источник

f

for(int c; (c = getc... in Compiler Development
Стоит задача, имея только AST cобрать конкретное дерево разбора. AST сгенерировано само по себе, какой-то другой частью программы, и (для простоты задачи) не соответвует никакому существующему коду.
источник

PS

Pavel Samolysov in Compiler Development
К вашему вопросу может это и не сложно восстановить, по той же грамматике смотреть правила вывода для родительского узла и добавлять ноды с токенами для дочерних, раз call, значит нужны скобки и аргументы разделить запятыми. Сложно только если те же скобки не обязательны типа if (cond) но можно и if cond, тогда никто не скажет как было.
источник

MO

Mar Ort in Compiler Development
for(int c; (c = getchar()) != EOF;)
Стоит задача, имея только AST cобрать конкретное дерево разбора. AST сгенерировано само по себе, какой-то другой частью программы, и (для простоты задачи) не соответвует никакому существующему коду.
так вы в строку отрендерить хотите?
источник

f

for(int c; (c = getc... in Compiler Development
Mar Ort
так вы в строку отрендерить хотите?
Ну в конечном итоге да, в строку, но тут уже полного соответствия быть не должно, так что это можно написать вручную частично
источник

f

for(int c; (c = getc... in Compiler Development
Или преобразовать CST что-то типа вложенных блоков текста с которыми потом может работать pretty-printer
источник

MO

Mar Ort in Compiler Development
for(int c; (c = getchar()) != EOF;)
Ну в конечном итоге да, в строку, но тут уже полного соответствия быть не должно, так что это можно написать вручную частично
вам визитор нужен просто, или я не понимаю проблемы
источник

f

for(int c; (c = getc... in Compiler Development
Нет, нет, проблемы в рендеринге в строку нет, меня интересовало только преобразование AST -> CST, с остальным все достаточно понятно.
источник

MO

Mar Ort in Compiler Development
for(int c; (c = getchar()) != EOF;)
Нет, нет, проблемы в рендеринге в строку нет, меня интересовало только преобразование AST -> CST, с остальным все достаточно понятно.
Трансформер тогда, по ноде АСТ создаете соответствующую ноду ЦСТ, а дополнительную информацию какими-то эвристиками видимо
источник

KY

Kirill Yukhin in Compiler Development
Привет! Понимаю, вопрос не оч корректный. Но может у кого-то завалялся spec 2006 (важно) версии 1.2, оказывается у меня 1.0 только остался после нескольких переездов. Если есть - постучите мне пожалуйста в личку.
источник