#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
в документации по шаблонам flex2. Я не смог этого найти. можете ли вы дать ссылку и объяснить, что такое
r/s
? Я задаю проблему в целом, а не только для flex, однако я не смог найти то, что вы упомянули.3. извините, должно быть, вставил неправильный URL. Вот что я имел в виду: westes.github.io/flex/manual/Patterns.html . Вы можете выполнить поиск строки на этой странице
r/s
.
Ответ №1:
Вам нужно изменить логику таким образом, чтобы после просмотра [
в объявлении массива (и до просмотра соответствующего ]
) вы могли ожидать только целочисленные числа, что подразумевает, что вам нужно иметь способ анализа целочисленных констант, который не пытается анализировать реальные значения.
Итак, в произвольных выражениях (например, a := <expression>
) вы хотите иметь возможность анализировать все виды констант, но в объявлениях массивов вы хотите использовать анализатор, ограниченный целыми числами.