2015-07-12 2 views
0

Я уже прочитал this и this вопросов. Они весьма полезны, но все же у меня есть некоторые сомнения относительно генерации токена в лексическом анализаторе для C. Что делать, если лексический анализатор обнаруживает int a2.5c;, тогда, согласно моим договоренностям, будет создано 7 токенов.Уточнение относительно лексических ошибок в C

int keyword 
a identifier 
2 constant 
. special symbol 
5 constant 
c identifier 
; special symbol 

Таким образом, лексический анализатор не сообщает о каких-либо ошибках, и токены будут сгенерированы успешно.

Правильно ли я понимаю? Если нет, можете ли вы, пожалуйста, помочь мне понять?

Также если мы объявляем константу как double a = 10.10.10;
Будет ли она генерировать любые лексические ошибки? Зачем?

ОБНОВЛЕНИЕ: спрашивает из любопытства, что, если лексический анализатор обнаруживает :-) смайлик в программе? Будет ли он генерировать любую лексическую ошибку? Потому что в соответствии с моим пониманием : будет рассматриваться как специальный символ, - будет рассматриваться в качестве оператора и снова ) будет рассматриваться как специальный символ
Спасибо

+0

Существует много ресурсов относительно конструкции _compiler. Книга Н. Вирта с таким же именем доступна для скачивания бесплатно. – Olaf

+0

Я ценю вашу помощь. Я скачал книгу и прочту ее. :) –

+0

В чем проблема C, '2' не запускает новый токен, а является частью идентификатора. И '5c' без пробелов между ними не является допустимым токеном. –

ответ

2

Ваш первый список лексем почти правильно - a2 является действительным идентификатор.

Его правда, что первый пример не будет генерировать никаких «лексических» ошибок per se, хотя будет ошибка синтаксического анализа на ..

Трудно сказать, является ли ошибка во втором примере лексической ошибкой или ошибкой синтаксического анализа. Лексическая структура константы с плавающей запятой довольно сложна. Я могу представить компилятор, который захватывает строку цифр и . и e/E и не замечает, пока он не назовет эквивалент strtod, что есть две десятичные точки, что означает, что он может сообщить «лексическую ошибку». Строго говоря, хотя у нас есть две константы с плавающей запятой в строке - 10.10 и .10, что означает, что это скорее «ошибка синтаксического анализа».

В конце концов, однако, все это просто ошибки. Если вы не принимаете класс проектирования/построения компилятора, я не уверен, насколько важно классифицировать ошибки как лексические, так и другие.


Обращаясь к вашему последующему на вопрос, да, :-) бы ЛЕКС как три лексемы :, - и ).

Поскольку практически любой символ пунктуации является законным в C, существует относительно мало символов, которые лексически нелегальны (то есть будут генерировать ошибки во время фазы лексического анализа). В самом деле, только те, которые я могу думать о том, являются:

  • недопустимого символ (я думаю, что только неиспользуемые являются `и @)
  • различных проблем с символьными и строковыми константами (отсутствующих ' или ", плохой побегом последовательности и т. д.)

Действительно, почти любая строка пунктуации, которую вы хотите ударить, будет проходить через лексический анализатор C, хотя, разумеется, она может или не может анализироваться. (Несколько печально известный пример a+++++b, которые, к сожалению, как lexes a++ ++ + b и, следовательно, ошибка синтаксиса.)

+0

Спасибо за объяснение. Теперь это имеет смысл. На самом деле я внедряю простой лексический анализатор C как h/w, поэтому мне нужно было прояснить эти сомнения. –

+0

Спрашивая из любопытства, что, если лексический анализатор обнаруживает ':-)' смайлик вроде вещи в программе? Будет ли он генерировать любую лексическую ошибку? Потому что в соответствии с моими пониманиями ':' будет рассматриваться как 'специальный символ',' -' будет рассматриваться как 'operator' и снова') 'будет рассматриваться как' специальный символ' –

+0

@HardikModha: Да, я считаю, что это правильно , –

0

: C лексер я написал размечает это как

keyid int 
white " " 
keyid a2 
const .5 
keyid c 
punct ; 
white "\n" 

Где KeyID это ключевое слово или идентификторов; const - численная константа, а punct - пунктуатор (белый - пробел). Я бы не сказал, что есть лексическая ошибка; но, безусловно, синтаксическую ошибку, которая должна быть диагностирована из-за идентификатора, за которым следует численная константа, которую не может уменьшить правило грамматики.

Смежные вопросы