Python EBNF怎么读
Python EBNF how to read
所以我遇到了 Python 语言 (https://docs.python.org/3/reference/grammar.html) 的语法,但我不能完全理解它是如何工作的。特别是,我对这个关于 if 语句的片段很感兴趣。
if_stmt: 'if' namedexpr_test ':' suite ('elif' namedexpr_test ':' suite)* ['else' ':' suite]
[...]
namedexpr_test: test [':=' test]
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_op expr)*
# <> 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'
这里有一定的风格。根据 and_test
定义 or_test
并根据 not_test
再次定义 and_test
。这种风格的优势是什么? (因为我看到它也用在 C++ 的语法中,很可能还有许多其他语言)。
它编码优先级。使用此语法,您可以明确地解析表达式
not x and y or z
作为
or_test
/ \
/ z
and_test
/ \
/ y
not_test
|
x
以 "expected" 方式,不需要括号。
所以我遇到了 Python 语言 (https://docs.python.org/3/reference/grammar.html) 的语法,但我不能完全理解它是如何工作的。特别是,我对这个关于 if 语句的片段很感兴趣。
if_stmt: 'if' namedexpr_test ':' suite ('elif' namedexpr_test ':' suite)* ['else' ':' suite]
[...]
namedexpr_test: test [':=' test]
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_op expr)*
# <> 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'
这里有一定的风格。根据 and_test
定义 or_test
并根据 not_test
再次定义 and_test
。这种风格的优势是什么? (因为我看到它也用在 C++ 的语法中,很可能还有许多其他语言)。
它编码优先级。使用此语法,您可以明确地解析表达式
not x and y or z
作为
or_test
/ \
/ z
and_test
/ \
/ y
not_test
|
x
以 "expected" 方式,不需要括号。