Python10.完整的语法规范

python lib

这是完整的Python语法,它被送入解析器生成器,以生成解析Python源文件的解析器:

python3 notranslate">
# Grammar for Python

# NOTE WELL: You should also follow all the steps listed at

# https://devguide.python.org/grammar/

# Start symbols for the grammar:

# single_input is a single interactive statement;

# file_input is a module or sequence of commands read from an input file;

# eval_input is the input for the eval() functions.

# NB: compound_stmt in single_input is followed by extra NEWLINE!

single_input:NEWLINE|simple_stmt|compound_stmtNEWLINE

file_input:(NEWLINE|stmt)*ENDMARKER

eval_input:testlistNEWLINE*ENDMARKER

decorator:'@'dotted_name['('[arglist]')']NEWLINE

decorators:decorator+

decorated:decorators(classdef|funcdef|async_funcdef)

async_funcdef:'async'funcdef

funcdef:'def'NAMEparameters['->'test]':'suite

parameters:'('[typedargslist]')'

typedargslist:(tfpdef['='test](','tfpdef['='test])*[','[

'*'[tfpdef](','tfpdef['='test])*[','['**'tfpdef[',']]]

|'**'tfpdef[',']]]

|'*'[tfpdef](','tfpdef['='test])*[','['**'tfpdef[',']]]

|'**'tfpdef[','])

tfpdef:NAME[':'test]

varargslist:(vfpdef['='test](','vfpdef['='test])*[','[

'*'[vfpdef](','vfpdef['='test])*[','['**'vfpdef[',']]]

|'**'vfpdef[',']]]

|'*'[vfpdef](','vfpdef['='test])*[','['**'vfpdef[',']]]

|'**'vfpdef[',']

)

vfpdef:NAME

stmt:simple_stmt|compound_stmt

simple_stmt:small_stmt(';'small_stmt)*[';']NEWLINE

small_stmt:(expr_stmt|del_stmt|pass_stmt|flow_stmt|

import_stmt|global_stmt|nonlocal_stmt|assert_stmt)

expr_stmt:testlist_star_expr(annassign|augassign(yield_expr|testlist)|

('='(yield_expr|testlist_star_expr))*)

annassign:':'test['='test]

testlist_star_expr:(test|star_expr)(','(test|star_expr))*[',']

augassign:('+='|'-='|'*='|'@='|'/='|'%='|'&='|'|='|'^='|

'<<='|'>>='|'**='|'//=')

# For normal and annotated assignments, additional restrictions enforced by the interpreter

del_stmt:'del'exprlist

pass_stmt:'pass'

flow_stmt:break_stmt|continue_stmt|return_stmt|raise_stmt|yield_stmt

break_stmt:'break'

continue_stmt:'continue'

return_stmt:'return'[testlist]

yield_stmt:yield_expr

raise_stmt:'raise'[test['from'test]]

import_stmt:import_name|import_from

import_name:'import'dotted_as_names

# note below: the ('.' | '...') is necessary because '...' is tokenized as ELLIPSIS

import_from:('from'(('.'|'...')*dotted_name|('.'|'...')+)

'import'('*'|'('import_as_names')'|import_as_names))

import_as_name:NAME['as'NAME]

dotted_as_name:dotted_name['as'NAME]

import_as_names:import_as_name(','import_as_name)*[',']

dotted_as_names:dotted_as_name(','dotted_as_name)*

dotted_name:NAME('.'NAME)*

global_stmt:'global'NAME(','NAME)*

nonlocal_stmt:'nonlocal'NAME(','NAME)*

assert_stmt:'assert'test[','test]

compound_stmt:if_stmt|while_stmt|for_stmt|try_stmt|with_stmt|funcdef|classdef|decorated|async_stmt

async_stmt:'async'(funcdef|with_stmt|for_stmt)

if_stmt:'if'test':'suite('elif'test':'suite)*['else'':'suite]

while_stmt:'while'test':'suite['else'':'suite]

for_stmt:'for'exprlist'in'testlist':'suite['else'':'suite]

try_stmt:('try'':'suite

((except_clause':'suite)+

['else'':'suite]

['finally'':'suite]|

'finally'':'suite))

with_stmt:'with'with_item(','with_item)*':'suite

with_item:test['as'expr]

# NB compile.c makes sure that the default except clause is last

except_clause:'except'[test['as'NAME]]

suite:simple_stmt|NEWLINEINDENTstmt+DEDENT

test:or_test['if'or_test'else'test]|lambdef

test_nocond:or_test|lambdef_nocond

lambdef:'lambda'[varargslist]':'test

lambdef_nocond:'lambda'[varargslist]':'test_nocond

or_test:and_test('or'and_test)*

and_test:not_test('and'not_test)*

not_test:'not'not_test|comparison

comparison:expr(comp_opexpr)*

# <> isn't actually a valid comparison operator in Python. It's here for the

# sake of a __future__ import described in PEP 401 (which really works :-)

comp_op:'<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not''in'|'is'|'is''not'

star_expr:'*'expr

expr:xor_expr('|'xor_expr)*

xor_expr:and_expr('^'and_expr)*

and_expr:shift_expr('&'shift_expr)*

shift_expr:arith_expr(('<<'|'>>')arith_expr)*

arith_expr:term(('+'|'-')term)*

term:factor(('*'|'@'|'/'|'%'|'//')factor)*

factor:('+'|'-'|'~')factor|power

power:atom_expr['**'factor]

atom_expr:['await']atomtrailer*

atom:('('[yield_expr|testlist_comp]')'|

'['[testlist_comp]']'|

'{'[dictorsetmaker]'}'|

NAME|NUMBER|STRING+|'...'|'None'|'True'|'False')

testlist_comp:(test|star_expr)(comp_for|(','(test|star_expr))*[','])

trailer:'('[arglist]')'|'['subscriptlist']'|'.'NAME

subscriptlist:subscript(','subscript)*[',']

subscript:test|[test]':'[test][sliceop]

sliceop:':'[test]

exprlist:(expr|star_expr)(','(expr|star_expr))*[',']

testlist:test(','test)*[',']

dictorsetmaker:(((test':'test|'**'expr)

(comp_for|(','(test':'test|'**'expr))*[',']))|

((test|star_expr)

(comp_for|(','(test|star_expr))*[','])))

classdef:'class'NAME['('[arglist]')']':'suite

arglist:argument(','argument)*[',']

# The reason that keywords are test nodes instead of NAME is that using NAME

# results in an ambiguity. ast.c makes sure it's a NAME.

# "test '=' test" is really "keyword '=' test", but we have no such token.

# These need to be in a single rule to avoid grammar that is ambiguous

# to our LL(1) parser. Even though 'test' includes '*expr' in star_expr,

# we explicitly match '*' here, too, to give it proper precedence.

# Illegal combinations and orderings are blocked in ast.c:

# multiple (test comp_for) arguments are blocked; keyword unpackings

# that precede iterable unpackings are blocked; etc.

argument:(test[comp_for]|

test'='test|

'**'test|

'*'test)

comp_iter:comp_for|comp_if

sync_comp_for:'for'exprlist'in'or_test[comp_iter]

comp_for:['async']sync_comp_for

comp_if:'if'test_nocond[comp_iter]

# not used in grammar, but may appear in "node" passed from Parser to Compiler

encoding_decl:NAME

yield_expr:'yield'[yield_arg]

yield_arg:'from'test|testlist

以上是 Python10.完整的语法规范 的全部内容, 来源链接: utcz.com/z/508455.html

回到顶部