integer ::= decinteger | bininteger | octinteger | hexinteger
decinteger ::= nonzerodigit (["_"] digit)* | "0"+ (["_"] "0")*
bininteger ::= "0" ("b" | "B") (["_"] bindigit)+
octinteger ::= "0" ("o" | "O") (["_"] octdigit)+
hexinteger ::= "0" ("x" | "X") (["_"] hexdigit)+
nonzerodigit ::= "1"..."9"
digit ::= "0"..."9"
bindigit ::= "0" | "1"
octdigit ::= "0"..."7"
hexdigit ::= digit | "a"..."f" | "A"..."F"
Я не могу понять, почему 00 является допустимым целым числом с такими определениями? Однако кажется, что nonzerodigit должна быть ведущей цифрой:
>>> isinstance(00, int)
True
А может быть тот же вопрос: почему 0 действителен?
Также второй раздел после оператора OR (| "0"+ (["_"] "0")*) будет охватывать шаблон 00.
@abdul-niyas-p-m Разве нам не следует читать эту строку как nonzerodigit, за которой следует ...?
Если бы это было так, то было бы написано nonzerodigit ((["_"] digit)* | "0"+ (["_"] "0")*)(ИЛИ кейс был бы завернут в паранетис)
Чередование имеет самый низкий приоритет в EBNF. Итак, nonzerodigit есть только в первом варианте.
@barmar Тем не менее, страница обозначений включает пример с тем же синтаксисом: onething (another)* и указывает: onething, за которым следует последовательность из нуля или более... Я интерпретирую это как onething, который является обязательным.
Это. Но | делит его на две альтернативы. nonzerodigit является обязательным только в первом варианте.
И "0"+ является обязательным во втором варианте.
Итак, decinteger имеет два синтаксиса: один для чисел, начинающихся с 0, другой для чисел, не начинающихся с 0. А последний позволяет быть только остальным цифрам 0
Хорошо, теперь я понял! Спасибо.






Чего вам не хватает, так это того, что обозначение | для альтернатив имеет самый низкий приоритет. Итак, decinteger разделен на два отдельных производства:
nonzerodigit (["_"] digit)*"0"+ (["_"] "0")*Первый предназначен для чисел, не начинающихся с 0, он допускает любые цифры в остальной части числа. Второй предназначен для чисел, начинающихся с 0, он допускает только числа, состоящие из 0. Оба позволяют вставлять необязательные символы _ между цифрами для облегчения чтения.
Таким образом, 0, 00, 000 и т. д. во втором произведении разрешены как допустимые десятичные целые числа. И все их значения равны нулю.
В некоторых документах EBNF альтернативы вынесены в отдельные строки, чтобы было легче увидеть разбивку. В документации Python выбран этот более компактный формат.
чуть ниже таблицы, которую вы скопировали, написано:
Note that leading zeros in a non-zero decimal number are not allowed, This is for disambiguation with C-style octal literals, which Python used before version 3.0но в вашем случае перед ведущим нулем стоит нулевое десятичное число, что разрешено.