Распознает ли C # числа, начинающиеся с цифр за пределами 0-9? - PullRequest
0 голосов
/ 17 апреля 2019

В C # лексический токен распознается как идентификатор или ключевое слово, если он начинается с буквы или подчеркивания, и числа, если он начинается с цифры.

Буква в этом контексте не ограничивается[A-Za-z];это может быть любая буква Unicode, распознаваемая char.IsLetter.

. Любые символы за пределами [0-9] одинаково распознаются как цифры для распознавания числовых литералов?

1 Ответ

2 голосов
/ 17 апреля 2019

Ответ - нет, но он сложнее, чем просто.

Если вы посмотрите на спецификацию языка , вы поймете, что я имею в виду:

integer_literal
    : decimal_integer_literal
    | hexadecimal_integer_literal
    ;

decimal_integer_literal
    : decimal_digit+ integer_type_suffix?
    ;

decimal_digit
    : '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
    ;

integer_type_suffix
    : 'U' | 'u' | 'L' | 'l' | 'UL' | 'Ul' | 'uL' | 'ul' | 'LU' | 'Lu' | 'lU' | 'lu'
    ;

hexadecimal_integer_literal
    : '0x' hex_digit+ integer_type_suffix?
    | '0X' hex_digit+ integer_type_suffix?
    ;

hex_digit
    : '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
    | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f';

Как видите, + или - не являются частью целочисленной литеральной спецификации, поэтому для начала этого правила всегда требуется цифра (либо 0-9 для десятичных целых чисел, либо 0, а затем x для шестнадцатеричных целых).

Разбор правил сложнее, чем просто проверка первого символа, чтобы определить, какому правилу следовать. Изучение методологии прогнозирования ANTLR ( LL (*) ) многому вас научит. Проще говоря, все правило должно быть проанализировано, иначе оно не сможет проанализировать это правило. Это не только основано на начале правила.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...