python 中函数的 EBNF

EBNF for a function in python

我是 python 的新手,想知道如何为函数编写 ebnf。 我做了以下-

id ⇐ definition of legal function/variable name
val ⇐ definition of legal int value

use
def, comma, parentheses, and colon

这是我所做的,但我认为它不正确:

def id([id=val,id=val]):

Language Reference -> Compound statements -> Function definitions 有这个:

funcdef        ::=  [decorators] "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite
decorators     ::=  decorator+
decorator      ::=  "@" dotted_name ["(" [parameter_list [","]] ")"] NEWLINE
dotted_name    ::=  identifier ("." identifier)*
parameter_list ::=  (defparameter ",")*
                    | "*" [parameter] ("," defparameter)* ["," "**" parameter]
                    | "**" parameter
                    | defparameter [","] )
parameter      ::=  identifier [":" expression]
defparameter   ::=  parameter ["=" expression]
funcname       ::=  identifier

文档中的语法并不总是与用于生成解析器的语法相同。 (后者可能不太可读。)甚至解析器语法也可能不完整,因为某些约束仅在编译时强制执行。上面的那个并没有完全捕捉到一旦给出默认值,所有后续位置参数都必须具有默认值的约束。 parameter list 的制作好像还有其他问题

通过删除装饰器、注释和所有“*”的东西来简化,但添加约束,主要使用您的风格,并忽略最后的尾随逗号是可选的问题,导致

def id '(' (id,)* (id=val,)* ')' :

(必须用引号将文字 () 与分组 () 区分开来。)