В тесте if/while я бы разрешил использовать произвольные выражения, а не только переменные.
Я сделал это в парсере, но забыл поправить БНФ. Ща.
-- 31 мар 2020, 00:26 --Готово.
Примерно аналогичное с разбором statement_list, может получиться пустая строка не одним способом: непосредственно как ноль повторений в statement* и как сколько-то повторений, в каждом из которых statement → EMP.
Я вообще в парсере от EMP в итоге отказался (в лексере оставил, но оно никогда не случится).
-- 31 мар 2020, 00:27 --Ещё непосредственно в грамматике не учтён приоритет операций + * - ~
Сложно придумать интуитивно понятный приоритет, поэтому он по умолчанию тут одинаков.
-- 31 мар 2020, 00:28 --Сейчас самое важное - помочь с этим (тут речь о машинном коде Madhine):
Как, например, заставить функцию не вызываться без вызова ее? Куда прыгать после выполнения функции?
Может, для решения 2 ввести какую-нибудь операцию RetOp, которая бы возвращалась к вызвавшей данную функцию функции?
-- 31 мар 2020, 00:40 --Можно было бы не делать funcall типом оператора, а допустить использовать любое выражение как оператор, хотя конечно может не хотеться при этом писать операторы вида x + y. Можно было бы делать ворнинги «аа что ты творишь, результат же никуда не попадает!!11», натыкаясь на них в дереве разбора уже позже.
Тут не понял.
Есть избыточность с тем, что можно раскрыть block → statement_list → (statement)* → (block)*, и некоторые из реализаций, принимающих EBNF или похожее описание и выдающих парсер, выдали бы тут парсер, который зацикливался парся block, потому что block* попадается первее остальных альтернатив.
Посмотрите, как это в моем парсере реализовано.