Конструкция компилятора для Pascal - определение числа с плавающей точкой и формата массива - PullRequest
0 голосов
/ 31 марта 2019

Я хочу построить компилятор для псевдо-паскаля.Мы изучаем принципы компиляции и узнаем о сканере (лексическом анализаторе).Мы создаем DFA для нашего сканера, затем преобразуем его в код на основе коммутатора и генерируем код для этого DFA для чтения нашего файла.У нас проблема с псевдо-паскальским языком.
наши числа с плавающей точкой имеют следующий формат: d+. или d*.d+, поэтому 1. или .25 являются числами с плавающей точкой.
формат объявления массива является чем-тонапример: array[1 .. 25] of integer
пока в объявлении массива не будет пробела между числами и .., проблем не возникает, однако на этом языке мы можем написать его как 1..25.проблема возникает из-за того, что наши DFA совпадают 1. и .25 как два числа с плавающей запятой !!!
Наш учитель задает нам вопрос, как решить эту проблему с помощью изменения нашего DFA и кода сканера.
Примечание: Мы не хотим изменять код парсера, и парсеру нужно 3 токена (целое число .. целое число) для массива.поэтому мы должны вернуть 3 токена для массива и вернуть один токен, если это действительное число.(не число в объявлении массива)

Я прочитал много страниц о компиляторе и вижу что-то вроде отката для решения этой проблемы.Однако я думаю, что наш учитель не хотел этого, основываясь на том, что я от него спрашиваю.
Я много думаю и пробую по-другому.Единственное, что я могу сделать, это изменить код и использовать что-то вроде памяти, чтобы запомнить, что я прочитал . extra или поместил обратно . в поток файлов для последующего сканирования или изменил указатель файла для решения проблемы.
Iхотите убедиться, что нет способа решить эту проблему с изменением в DFA?Является ли упомянутое мной единственным способом ??
Извините за плохой английский.
Можно мне помочь?Спасибо.

1 Ответ

0 голосов
/ 31 марта 2019

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

IOW, в произвольных выражениях (например, a := <expression>) вы хотите иметь возможность разбирать все виды констант, но в объявлениях массивов вы хотите использовать синтаксический анализатор, ограниченный целыми числами.

...