2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1 ... 4, 5, 6, 7, 8, 9, 10, 11  След.
 
 Re: Тьюринг-полон ли данный язык
Сообщение28.03.2020, 15:31 


21/05/16
4292
Аделаида
Хотя, я только что понял, что массив может содержать еще что-то...
Да, действительно придется его тогда тоже в БНФ внести.

-- 28 мар 2020, 23:06 --

Закоммитил новую БНФ.

-- 28 мар 2020, 23:27 --

Написал лексер.

-- 28 мар 2020, 23:35 --

Упс, я про return забыл. Ща поправлю.

-- 28 мар 2020, 23:38 --

Поправил, закоммитил.

-- 28 мар 2020, 23:43 --

Еще я закоммитил один тест, но он не работает...

-- 28 мар 2020, 23:45 --

А, понял.

-- 28 мар 2020, 23:48 --

Все равно не работает...
Говорит, что я передаю два аргумента, хоть я и передаю один массив.

 Профиль  
                  
 
 Re: Тьюринг-полон ли данный язык
Сообщение28.03.2020, 16:40 


21/05/16
4292
Аделаида
А, я self пропустил. Ща поправлю.

-- 29 мар 2020, 00:13 --

Теперь ругается на '|'.join('(?P<%s>%s)' % pair for pair in token_specification).

-- 29 мар 2020, 00:16 --

А, это он на массив так ругается. Заменю на кортеж, как было в примере.

-- 29 мар 2020, 00:18 --

Теперь работает.

-- 29 мар 2020, 00:36 --

Хм, лексер надо немного изменить...

-- 29 мар 2020, 00:47 --

И внезапно тест перестал работать.

 Профиль  
                  
 
 Re: Тьюринг-полон ли данный язык
Сообщение28.03.2020, 17:42 


21/05/16
4292
Аделаида
А, понял. Ща поправлю.

-- 29 мар 2020, 01:18 --

Заэскэйпил символы, теперь выводит нечто совсем странное.

-- 29 мар 2020, 01:24 --

Еще чуть-чуть поправил, теперь выводит почти правильное. Но не совсем.

-- 29 мар 2020, 01:35 --

Кстати, сделав эту предварительную компиляцию регекспа, FID, VID и FORMVID перестали отличаться...

 Профиль  
                  
 
 Re: Тьюринг-полон ли данный язык
Сообщение29.03.2020, 13:23 


21/05/16
4292
Аделаида
Починил лексер. Проблему с FID, VID и FORMVID можно решить, переименовав их всех в один ID (а отличия уже делать на уровне парсера).

-- 29 мар 2020, 20:59 --

Готово. Пойду писать парсер.

 Профиль  
                  
 
 Re: Тьюринг-полон ли данный язык
Сообщение29.03.2020, 16:34 


21/05/16
4292
Аделаида
Написал парсер. Тестировать его буду примерно завтра.

 Профиль  
                  
 
 Re: Тьюринг-полон ли данный язык
Сообщение30.03.2020, 11:10 


21/05/16
4292
Аделаида
Я там добавил несколько дебаггеров. Баг такой, я не могу его починить:
Функция идет в formparams.
Получает токен-не COMMA (первый дебаггер), получает токен-не ID (второй дебаггер), откатывает значения токена и позиции к старым (третий дебаггер).
Возвращается в func (четвертый дебаггер).
Получает токен-RBR (пятый дебаггер), и тут внезапно получает не тот токен, не LCBR, а RET (шестой дебаггер)!

-- 30 мар 2020, 18:42 --

Это баг в лексере, похоже. Когда я запускаю
Код:
lexer.pos = 15
print(lexer.get_next_token())
lexer.pos = 15
print(lexer.get_next_token())
, я тоже получаю разные токены.

-- 30 мар 2020, 18:44 --

Понял, это потому что re.iter - генератор, а не массив. Обернуть его в list?

-- 30 мар 2020, 18:46 --

Ага, теперь этого бага нет. Буду чинить следующий.

 Профиль  
                  
 
 Re: Тьюринг-полон ли данный язык
Сообщение30.03.2020, 12:30 


21/05/16
4292
Аделаида
Уф, кажется, починил всю тыщу багов.

-- 30 мар 2020, 20:01 --

Пойду еще что-то добавлю и распарсю.

-- 30 мар 2020, 20:03 --

Парсер не поддерживает вложенные блоки, пойду БНФ чинить.

-- 30 мар 2020, 20:33 --

Кажись, работает.

-- 30 мар 2020, 20:34 --

Пойду проверю, правильное ли дерево парсер выдает (ошибку он уже не выдает).

-- 30 мар 2020, 20:34 --

Пойду проверю, правильное ли дерево парсер выдает (ошибку он уже не выдает).

-- 30 мар 2020, 20:48 --

Вроде теперь все работает.

 Профиль  
                  
 
 Re: Тьюринг-полон ли данный язык
Сообщение30.03.2020, 13:23 
Заслуженный участник


27/04/09
28128
Время вроде появилось, теперь боюсь начинать разбирать всё это. :-) Оох…

 Профиль  
                  
 
 Re: Тьюринг-полон ли данный язык
Сообщение30.03.2020, 13:24 


21/05/16
4292
Аделаида
Да тут разбирать особо нечего.

 Профиль  
                  
 
 Re: Тьюринг-полон ли данный язык
Сообщение30.03.2020, 13:24 


21/05/16
4292
Аделаида
Да тут разбирать особо нечего.

-- 30 мар 2020, 20:55 --

Загляните просто в репозиторий:
https://github.com/LeviPesin/S1-compiler

-- 30 мар 2020, 21:19 --

Приступлю пока к самому компилятору...

 Профиль  
                  
 
 Re: Тьюринг-полон ли данный язык
Сообщение30.03.2020, 14:29 


21/05/16
4292
Аделаида
Вот пытаюсь понять, как лучше определить локальные и глобальные переменные? Все упирается в то, что переменная не может понять, внутри какой функции создается.

-- 30 мар 2020, 22:35 --

Попробую реализовать несколько программ вручную, посмотреть, что получится в итоге.

-- 30 мар 2020, 22:44 --

Вручную возникли некоторые проблемы. Как, например, заставить функцию не вызываться без вызова ее? Куда прыгать после выполнения функции?

-- 30 мар 2020, 22:45 --

arseniiv

 Профиль  
                  
 
 Re: Тьюринг-полон ли данный язык
Сообщение30.03.2020, 16:50 
Заслуженный участник


27/04/09
28128
[Сейчас продолжу читать, электричество отваливалось. Хотя бы в браузере сохранился неотправленный кусок поста, ура.]

Ага, во, есть что сказать. Вы комментарии в грамматику включили, а обычно они допускаются между любыми двумя токенами и потому разбираются (и автоматически выкидываются) лексером.

В тесте if/while я бы разрешил использовать произвольные выражения, а не только переменные.

Есть избыточность с тем, что можно раскрыть block → statement_list → (statement)* → (block)*, и некоторые из реализаций, принимающих EBNF или похожее описание и выдающих парсер, выдали бы тут парсер, который зацикливался парся block, потому что block* попадается первее остальных альтернатив.

Примерно аналогичное с разбором statement_list, может получиться пустая строка не одним способом: непосредственно как ноль повторений в statement* и как сколько-то повторений, в каждом из которых statement → EMP.

Можно было бы не делать funcall типом оператора, а допустить использовать любое выражение как оператор, хотя конечно может не хотеться при этом писать операторы вида x + y. Можно было бы делать ворнинги «аа что ты творишь, результат же никуда не попадает!!11», натыкаясь на них в дереве разбора уже позже.

Ещё непосредственно в грамматике не учтён приоритет операций + * - ~, но его можно учитывать уже опять же в дереве разбора, особенно если собирать выражения вида a + b - c * d ~ e * f (без скобок на этом уровне) в плоский список и разбирать в нём, кто первее хватает аргументы, уже после. Или до получения окончательного дерева разбора, но не непосредственно в парсере (хватать результат разбора expr и над ним колдовать).

Ещё в принципе уже просто для читаемости грамматики можно токенам-литералам типа "whilee" или "," не придавать отдельных имён (только в коде лексера), а писать их вот так в кавычках прям на местах использования.

 Профиль  
                  
 
 Re: Тьюринг-полон ли данный язык
Сообщение30.03.2020, 16:53 


21/05/16
4292
Аделаида
arseniiv в сообщении #1449558 писал(а):
В тесте if/while я бы разрешил использовать произвольные выражения, а не только переменные.

Я сделал это в парсере, но забыл поправить БНФ. Ща.

-- 31 мар 2020, 00:26 --

Готово.
arseniiv в сообщении #1449558 писал(а):
Примерно аналогичное с разбором statement_list, может получиться пустая строка не одним способом: непосредственно как ноль повторений в statement* и как сколько-то повторений, в каждом из которых statement → EMP.

Я вообще в парсере от EMP в итоге отказался (в лексере оставил, но оно никогда не случится).

-- 31 мар 2020, 00:27 --

arseniiv в сообщении #1449558 писал(а):
Ещё непосредственно в грамматике не учтён приоритет операций + * - ~

Сложно придумать интуитивно понятный приоритет, поэтому он по умолчанию тут одинаков.

-- 31 мар 2020, 00:28 --

Сейчас самое важное - помочь с этим (тут речь о машинном коде Madhine):
kotenok gav в сообщении #1449529 писал(а):
Как, например, заставить функцию не вызываться без вызова ее? Куда прыгать после выполнения функции?

Может, для решения 2 ввести какую-нибудь операцию RetOp, которая бы возвращалась к вызвавшей данную функцию функции?

-- 31 мар 2020, 00:40 --

arseniiv в сообщении #1449558 писал(а):
Можно было бы не делать funcall типом оператора, а допустить использовать любое выражение как оператор, хотя конечно может не хотеться при этом писать операторы вида x + y. Можно было бы делать ворнинги «аа что ты творишь, результат же никуда не попадает!!11», натыкаясь на них в дереве разбора уже позже.

Тут не понял.
arseniiv в сообщении #1449558 писал(а):
Есть избыточность с тем, что можно раскрыть block → statement_list → (statement)* → (block)*, и некоторые из реализаций, принимающих EBNF или похожее описание и выдающих парсер, выдали бы тут парсер, который зацикливался парся block, потому что block* попадается первее остальных альтернатив.

Посмотрите, как это в моем парсере реализовано.

 Профиль  
                  
 
 Re: Тьюринг-полон ли данный язык
Сообщение30.03.2020, 17:40 
Заслуженный участник


27/04/09
28128
Пошёл читать лексер. Вижу токен для пустой строки, это мм может привести к чему-то странному: когда в исходной строке будут нераспознаваемые последовательности, лексер должен начать выдавать этот токен бесконечно, не продвигаясь дальше. Пустота обычно обрабатывается уже парсером как не-чтение следующего токена в этом месте правила.

Токен-комментарий, если не позволять вложенные комментарии, можно сделать с таким регэксом: /\*.*?\*/ (.*? сделает, чтобы не захватывались "*/" почём зря). Притом к нему альтернативой можно будет прибавить //.*?\n, чтобы позволить однострочные комментарии. И пропускать его в лексере вместе со SPACE. А, можно его даже прям и в SPACE приделать, хотя с другой стороны мы могли бы подумать о будущих комментариях для документации, или комментариях—командах компилятору… ну да ладно, всё легко меняется при надобности, сейчас можно будет просто изменить регэксп для SPACE в \s+|/\*.*?\*/|//.*?\n (и убедиться, что я не навыдумывал ерунду, а то я пока пишу без проверки).

 Профиль  
                  
 
 Re: Тьюринг-полон ли данный язык
Сообщение30.03.2020, 17:49 


21/05/16
4292
Аделаида
Про EMP я и говорю, что на самом деле лексер никогда его не выведет.
Зачем комментариям удаляться в лексере? У меня ща они удаляются в парсере.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 160 ]  На страницу Пред.  1 ... 4, 5, 6, 7, 8, 9, 10, 11  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group