Skip to content

Commit

Permalink
feat: Add Python grammar introduction blog post
Browse files Browse the repository at this point in the history
  • Loading branch information
lihuanshuai committed Jun 13, 2024
1 parent fef301c commit 5ccd67a
Showing 1 changed file with 160 additions and 0 deletions.
160 changes: 160 additions & 0 deletions content/posts/python-grammar.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
+++
title = 'Python 语法介绍'
date = 2024-06-14T00:13:47+08:00
tags = ['Python', 'Grammar']
draft = false

[params]
mermaid = true
+++

# Python 语法介绍

语法(Grammar),是一门编程语言的基础,它指定了解释器如何解释源代码。Python 语法简洁明了,易于学习和使用,但是也有一些特殊的地方,需要特别注意。

## Grammar 语法

Python 的语法是由一系列规则组成的,这些规则定义了 Python 语言的语法结构。Python 的语法规则是由 Python Enhancement Proposals (PEP) 中的 [PEP 617](https://peps.python.org/pep-0617/) 定义的。

下面是 Python 语法的一部分:

```python
file: [statements] ENDMARKER
interactive: statement_newline
eval: expressions NEWLINE* ENDMARKER
func_type: '(' [type_expressions] ')' '->' expression NEWLINE* ENDMARKER
```

如上所示,`file` 是一个规则名字,`[statements] ENDMARKER` 是规则的表达式。其中,`[statements]` 表示 `statements` 是可选的,`[...]` 表示可选的规则;`ENDMARKER` 这种大写的名字表示一个 token,这里 `ENDMARKER` 表示文件结束符。

类似的,第三行中,`NEWLINE*` 表示零个或多个换行符,`NEWLINE` 表示一个换行符, `*` 表示零个或多个。

第四行中,`(``)``'->'` 是符号,单引号`'`围起来的是关键字。

这样,我们可以解读上述规则:

`file` 是 Python 代码的入口规则,`interactive` 是交互式 Python 代码的入口规则,`eval` 是表达式的入口规则,`func_type` 是函数类型的规则。

`file` 规则由 `statements``ENDMARKER` 组成,`statements` 是一系列语句的集合,`ENDMARKER` 是文件结束符。

`interactive` 规则由 `statement_newline` 组成,`statement_newline` 是一个语句后面跟着一个换行符。

`eval` 规则由 `expressions``NEWLINE*``ENDMARKER` 组成,`expressions` 是一系列表达式的集合,`NEWLINE*` 是零个或多个换行符,`ENDMARKER` 是文件结束符。

`func_type` 规则由 `(``[type_expressions]``)``'->'``expression``NEWLINE*``ENDMARKER` 组成,`type_expressions` 是一系列类型表达式的集合,`expression` 是一个表达式。

这样,我们可以通过这些规则来解析 Python 代码的顶层结构。

那么 statements、expression、assignment 等规则又是什么呢?

### 语句(Statements)

语句是 Python 代码的基本构建块,它们用于执行特定的操作。Python 语句包括复合语句(compound statements)和简单语句(simple statements)。

复合语句由多个简单语句组成,通常使用缩进来表示语句的层次结构。例如,`if` 语句、`for` 语句、`while` 语句等都是复合语句。

简单语句是 Python 代码的基本单元,它包括赋值语句、表达式语句、`import` 语句、`return` 语句等。

```python
statements: statement+

statement: compound_stmt | simple_stmts

statement_newline:
| compound_stmt NEWLINE
| simple_stmts
| NEWLINE
| ENDMARKER

simple_stmts:
| simple_stmt !';' NEWLINE # Not needed, there for speedup
| ';'.simple_stmt+ [';'] NEWLINE

simple_stmt:
| assignment
| type_alias
| star_expressions
| return_stmt
| import_stmt
| raise_stmt
| 'pass'
| del_stmt
| yield_stmt
| assert_stmt
| 'break'
| 'continue'
| global_stmt
| nonlocal_stmt

compound_stmt:
| function_def
| if_stmt
| class_def
| with_stmt
| for_stmt
| try_stmt
| while_stmt
| match_stmt
```

如上所示,`statements` 是一系列语句的集合,`statement` 是一个复合语句或简单语句,`statement_newline` 是一个语句后面跟着一个换行符。其中,`|` 表示或, `+` 表示一个或多个,`*` 表示零个或多个,`!` 表示不包含。

`simple_stmts` 是一个简单语句或多个简单语句的集合,`simple_stmt` 是一个简单语句,包括赋值语句、类型别名、表达式、`return` 语句、`import` 语句、`raise` 语句、`pass` 语句、`del` 语句、`yield` 语句、`assert` 语句、`break` 语句、`continue` 语句、`global` 语句、`nonlocal` 语句。

`compound_stmt` 是一个复合语句,包括函数定义、`if` 语句、类定义、`with` 语句、`for` 语句、`try` 语句、`while` 语句、`match` 语句。

### 表达式(Expressions)

表达式是 Python 代码的基本构建块,它们用于计算值。Python 表达式包括赋值表达式、条件表达式、逻辑表达式、算术表达式、位运算表达式等。

```python
expressions:
| expression (',' expression )+ [',']
| expression ','
| expression

expression:
| disjunction 'if' disjunction 'else' expression
| disjunction
| lambdef

yield_expr:
| 'yield' 'from' expression
| 'yield' [star_expressions]

star_expressions:
| star_expression (',' star_expression )+ [',']
| star_expression ','
| star_expression

star_expression:
| '*' bitwise_or
| expression

star_named_expressions: ','.star_named_expression+ [',']

star_named_expression:
| '*' bitwise_or
| named_expression

assignment_expression:
| NAME ':=' ~ expression

named_expression:
| assignment_expression
| expression !':='

disjunction:
| conjunction ('or' conjunction )+
| conjunction

conjunction:
| inversion ('and' inversion )+
| inversion

inversion:
| 'not' inversion
| comparison
```

如上所示,`expressions` 是一系列表达式的集合,`expression` 是一个表达式,包括赋值表达式、条件表达式、逻辑表达式、算术表达式、位运算表达式等。其中,`.` 表示连接,`+` 表示一个或多个,`*` 表示零个或多个,`!` 表示不包含,`~` 表示断言。

0 comments on commit 5ccd67a

Please sign in to comment.