Вопрос по лексическому анализу - PullRequest
3 голосов
/ 10 июля 2010

Я читаю книгу дракона. Цитирование текста из книги (3.1.4 Лексические ошибки, Pno 114)

Лексическому анализатору трудно расскажите, без помощи других компоненты, которые есть ошибка исходного кода. Например, если строка fi встречается для Впервые в программе на С контекст:

fi ( a == f(x) ) ...

лексический анализатор не может определить, fi - это неправильное написание ключевого слова if или необъявленная функция идентификатор. Поскольку fi является действительным лексема для идентификатора токена, лексический анализатор должен вернуть токен id парсер и пусть какой-то другой этап компилятор - наверное парсер в этот случай - обработать ошибку из-за транспонирование букв.

Я немного растерялся после прочтения этого. Насколько я понимаю, лексический анализатор начинает обрабатывать текст слева направо и возвращать токены всякий раз, когда шаблон соответствует. Так что для языка, в котором if является ключевым словом для сопоставления, как может fi соответствовать?

Есть мысли?

Ответы [ 4 ]

7 голосов
/ 10 июля 2010

Не соответствует токену if, но токену id, который обозначает «идентификатор». Это универсальное решение, если не найдено ни одного ключевого слова. Лексический анализатор не знает, чего ожидать в определенных позициях. Он просто возвращает токены, и парсер будет знать, чего он ожидает. Например, синтаксический анализатор C должен принять следующий оператор, который является вызовом функции

fi ( a  == f(x) );
2 голосов
/ 10 июля 2010

Вы должны проводить различие между синтаксическим анализом и лексическим анализом.

  • Задача лексического анализа - преобразовать последовательность символов в строку токенов.Могут быть различные типы токенов, например, ИДЕНТИФИКАТОР, ОПЕРАТОР ДОПОЛНЕНИЯ, ОПЕРАТОР ЗАКЛЮЧЕНИЯ и т. Д. Лексический анализ может завершиться с ошибкой только в том случае, если обнаружится строка текста, которая не соответствует ни одному токену.В вашем случае fi ( a == f(x) ) ... будет переводиться в <IDENTIFIER> <LEFT BRACKET> <IDENTIFIER> <EQUALITY> <IDENTIFIER> <LEFT BRACKET> <IDENTIFIER> <RIGHT BRACKET> <RIGHT BRACKET> .....

  • Как только строка токенов будет сгенерирована, выполняется синтаксический анализ.Обычно это включает в себя создание некоторого синтаксического дерева из токенов.Парсер знает обо всех формах допустимых утверждений, которые разрешены в языке.Если синтаксический анализатор не может найти синтаксическое правило, разрешающее указанную выше последовательность токенов, произойдет сбой.

1 голос
/ 10 июля 2010

Это плохой пример для объяснения ошибки лексического анализа. Этот текст пытается вам сказать, что компилятор не может распознать, что вы неправильно написали ключевое слово «if» (записали его в обратном направлении). Он просто видит «fi», которое является, например, допустимым именем переменной, и поэтому возвращает идентификатор (например) «VARIABLE» парсеру. Затем синтаксический анализатор реализует синтаксическую ошибку.

Это не имеет ничего общего с движением слева направо или справа налево. Компилятор, конечно, читает исходный код слева направо. Как я уже сказал - плохой выбор ключевого слова для этого объяснения.

1 голос
/ 10 июля 2010

Как бы вы сказали, если бы if был единственным ожидаемым вводом в данной точке?

int a = 42;
if (a == 42)
    puts("ok");

против

int a = 42;
fi (a == 42)
    puts("ok");

fi может быть вызовом функции. Например, вышеприведенное может быть неправильным написанием:

int a = 42;
fi(a == 42);
puts("ok");

, где fi - функция, принимающая int и возвращающая void.

...