Вам нужны разумные, удобные сообщения об ошибках.
Если ваш лексер принимает 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
, не обязательно должны точно соответствовать идеальным грамматикам, найденным в определениях языка.