2013-03-20 6 views
1

здесь один из правила, которое я видел в java.g4:ANTLR 4 java.g4 -> странное правило грамматики

ДесятичнымЛитералом: ('0' | '1' .. '9' '0'. .'9 '*) IntegerTypeSuffix? ;

Почему бы не писать об этом так:

ДесятичногоЛитерала: ('0' .. '9' +) IntegerTypeSuffix? ;

Есть ли что-нибудь, что мне не хватает? Благодарим Вас за отзыв

С уважением Philippe Frankson

ответ

4

Цель состоит в том, чтобы иметь 0 быть DecimalLiteral, но все остальные целые числа, начиная с 0 быть OctalLiteral.

Я предпочел бы использовать пару правил, как это:

OctalLiteral : '0'+ [1-7] [0-7]* IntegerTypeSuffix?; 
DecimalLiteral : [0-9]+ IntegerTypeSuffix?; 

А потом отложить проверку недействительных восьмеричных чисел (которые эта пара правил будет по-прежнему принимают в качестве DecimalLiteral) на более поздней стадии в процесс разбора.

+0

примечание: на грамматическом уровне это важно, но в нормальных случаях не имеет значения, если 0 анализируется как восьмеричный 0 или десятичный 0: они, скорее всего, получат одинаковое представление в памяти. 'DecimalLiteral: '1' .. '9' '0' .. '9' * IntegerTypeSuffix? ; 'должно быть достаточно – Martijn

Смежные вопросы