Восьмеричное число в грамматике ANSI C (лекс) - PullRequest
4 голосов
/ 05 мая 2019

Я посмотрел ANSI C грамматика (лекс) .

И это восьмеричное регулярное выражение

0{D}+{IS}?      { count(); return(CONSTANT); }

Мой вопрос: почему они принимают что-то вроде 0898?

Это не восьмеричная цифра.

Так что я думал, что они подумают об этом, но они просто так написали.

Не могли бы вы объяснить, почему это так? Спасибо

Ответы [ 3 ]

5 голосов
/ 05 мая 2019

Вам нужны разумные, удобные сообщения об ошибках.

Если ваш лексер принимает 0999, вы можете обнаружить недопустимую восьмеричную цифру и вывести разумное сообщение:

 int x = 0999;
          ^
 error: illegal octal digit, go back to school

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

 int x = 0999;
          ^
 error: expected ‘,’ or ‘;’ before numeric constant

Недопустимая программа отклоняется в любом случае, как и должно быть, однако якобы неверная грамматика lex лучше справляется с отчетами об ошибках.

Это показывает, что практические грамматики, созданные для таких инструментов, как lex или yacc, не обязательно должны точно соответствовать идеальным грамматикам, найденным в определениях языка.

4 голосов
/ 05 мая 2019

Грамматика, на которую вы постоянно ссылаетесь в своих вопросах, была создана в 1985 , за 4 года до публикации первого пересмотра стандарта С в 1989 году.

Это , а не грамматика, опубликованная в стандарте 1989 , в котором явно используется

восьмеричная-константа

  • 0

  • восьмеричная восьмеричная цифра

восьмеричная цифра: один из

  • 0 1 2 3 4 5 6 7

Даже тогда этой грамматики Lex достаточно для токенизации допустимой программы.

3 голосов
/ 05 мая 2019

Имейте в виду, что это всего лишь синтаксис, а не семантика.
Так что достаточно обнаружить «Не может быть ничего, кроме константы».
Нет необходимости (пока) обнаруживать «правильный восьмеричный»постоянная. ".

Обратите внимание, что здесь даже нет разницы между восьмеричным, десятичным и шестнадцатеричным.Все они регистрируются как «КОНСТАНТ».

...