Почему мы считаем строку одним токеном при лексическом анализе конструкции компилятора?

Я изучаю дизайн компилятора. Задача лексического анализатора в компиляторе - преобразовать код в поток токенов. Но я не понимаю, почему мы рассматриваем строку как отдельный токен. Например - printf("%d is integer", x); В этом заявлении printf, (, "%d is integer", ,, x, ), ; это жетоны, но почему %d в строке не считается отдельным токеном?

1 ответ

Поскольку спецификаторы формата, такие как (или любое другое содержимое строки), не имеют синтаксического смысла - нет элемента грамматики языка, который зависит от них. Содержимое строки (включая спецификаторы формата, например) - это данные , а не код, и поэтому компилятор не имеет значения. Последовательность символов имеет значение только во время выполнения и только для *printf/ *scanf семейства функций и только как часть строки формата.

Чтобы распознать отдельный токен, вам нужно будет токенизировать всю строку -, %d, is, integer, ". Это само по себе открывает целую банку червей, что затрудняет синтаксический анализ строк.

Некоторые компиляторы проверяют аргументы строки формата для и scanfпризывает выполнить некоторую базовую проверку работоспособности, но это уже после того, как токенизация уже произошла. На этапе токенизации вы не знаете, что это вызов printfбиблиотечная функция. Только после синтаксического анализа компилятор узнает, что это вызов конкретной библиотеки, и может выполнить такую ​​проверку.

Другие вопросы по тегам