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