Ответ - нет, но он сложнее, чем просто.
Если вы посмотрите на спецификацию языка , вы поймете, что я имею в виду:
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 (*) ) многому вас научит. Проще говоря, все правило должно быть проанализировано, иначе оно не сможет проанализировать это правило. Это не только основано на начале правила.