我是
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]):
语言参考 -> 复合语句 -> 函数定义有这个:
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
文档中的语法并不总是与用于生成解析器的语法相同。 (后者的可读性可能较差。 甚至解析器语法也可能不完整,因为某些约束仅在编译时强制执行。 上面的一个并没有完全捕获约束,即一旦给定默认值,所有后续位置参数都必须具有默认值。参数列表的生产似乎可能存在其他问题。
通过删除装饰器、注释和所有"*"内容来简化,但添加约束,主要使用您的样式,并忽略最终尾随逗号是可选的问题,导致
def id '(' (id,)*(id=val,)* ')' :
(必须用文字 () 括起来以区别于分组 ()。