Независимо от того, являются ли определяемые пользователем или иным образом целые и литералы с плавающей точкой положительными.
Причина довольно проста: если вы допускаете отрицательные литералы, лексинг становится зависящим от контекста. То есть, сталкиваясь с чем-то вроде - 10
, лексер не может просто взглянуть на этот текст отдельно и знать, следует ли рассматривать его как два отдельных токена (-
и 10
) или один (-10
). Если вы всегда относились к ней как единый знак, а затем что-то вроде a - 10
приведет к <a> and <-10>
(т.е. <identifier><literal>
, которая не является легитимной последовательность в C++ (или большинство других языков программирования).
Чтобы обойти это, синтаксический анализатор может передать некоторый контекст лексеру, сообщая в любой момент, ожидать ли (например) оператора или операнда, чтобы он знал, что если он должен был создать оператор, то -
следует рассматривать как токен , но если бы был найден операнд, -10
был бы единственным токеном.
Как правило, намного проще иметь одно правило, которое всегда следует за тысячами h, и тот, который работает, состоит в том, что -
всегда является оператором, а буквальный не может включать в себя -
.
Вы попробовали? Я думаю, что им разрешено – balki
@balki - да, я получаю ошибки компиляции - обновит OP за мгновение ... ... на самом деле, отрицательный двойной, как хорошо, из-за 'long double', но я не мог заставить его взять «длинный длинный» - попытаться повторить попытку. – kfmfe04
Какой компилятор вы используете? [Это еще не очень широко поддерживается.] (Http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport) – cgmb