Построение компилятора для Pascal — определение числа с плавающей запятой и формата массива

#compiler-construction #lexical-analysis #finite-automata

#компилятор-построение #лексический анализ #конечные автоматы

Вопрос:

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

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

Комментарии:

1. Смотрите синтаксис завершающего контекста r/s в документации по шаблонам flex

2. Я не смог этого найти. можете ли вы дать ссылку и объяснить, что такое r/s ? Я задаю проблему в целом, а не только для flex, однако я не смог найти то, что вы упомянули.

3. извините, должно быть, вставил неправильный URL. Вот что я имел в виду: westes.github.io/flex/manual/Patterns.html . Вы можете выполнить поиск строки на этой странице r/s .

Ответ №1:

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

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