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, Супермодераторы



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

Сейчас этот форум просматривают: Dmitriy40


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

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