Какая часть транслятора должна отслеживать ошибку типа «неверный формат числа»?

Пишу курсовой - транслятор языка высокого уровня. На этапе написания лексического анализа встал вопрос о том когда и где проверить целочисленный литерал на валидность (например, начинается ли он с нуля, аля 0978)? Задача лексического анализа - выделение токенов, которые являются подмножествм алфавита языка, не думаю, что он должен проверять валидностиь чисел.
Вот правило грамматики задающий шаблон для целых чисел:
<число> -> <цифра>|<число><цифра>
<цифра> -> 0|1|2|3|4|5|6|7|8|9
Жду предложений, аргументов, ссылки на ресурсы, книги и т.д.
  • Вопрос задан
  • 290 просмотров
Пригласить эксперта
Ответы на вопрос 3
lam0x86
@lam0x86
На этапе лексического анализа проверить валидность лексемы не всегда возможно. Скажем, тип данных int32 (условное название типа, содержащего знаковое 32-битное целое) может хранить число в диапазоне [-2147483648; 2147483647]. При этом, константное выражение "2147483648" считается невалидным, а то же самое, но со знаком минус "-2147483648" - вполне валидно. В идеале, лексический анализатор не должен знать о знаке числа. Определение того, унарный или бинарный это минус (а может, язык поддерживает интервалы типа "10-100" или еще какую-то экзотику), лежит на плечах синтаксического анализатора.
Однако, базовый анализ валидности токенов действительно проще делать в лексическом анализаторе. Например, строковые литералы чаще всего проверяются на валидность escape-символов именно в процессе лексического анализа. Чем раньше будет найдена ошибка, тем проще восстановить ошибочное состояние анализатора.
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Сразу же после того, как получите <число>
Ответ написан
Комментировать
@potan
Функциональный программист
Тут вопрос - входят ли невалидные числа в алфавит языка. Если не входят, проверке самое место в лексере.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы