练习 32：扫描器

def hello(x, y):
print(x + y)

hello(10, 20)


Python 也很棘手，因为它需要一个前导空白的正则表达式，来处理代码块的缩进和压缩。现在，让我们使用一个相当笨的^\s+，然后假装它也捕捉到行的开头使用了多少个空白。

def DEF
[a-zA-Z_][a-zA-Z0-9_]* NAME
[0-9]+ INTEGER
$$ LPAREN $$ RPAREN
\+ PLUS
: COLON
, COMMA
^\s+ INDENT

DEF NAME(hello) LPAREN NAME(x) COMMA NAME(y) RPAREN COLON
INDENT(4) NAME(print) LPAREN NAME(x) PLUS NAME(y) RPAREN
NAME(hello) RPAREN INTEGER(10) COMMA INTEGER(20) RPAREN


微型 Python 扫描器

import re

code = [
"def hello(x, y):",
"    print(x + y)",
"hello(10, 20)",
]

TOKENS = [
(re.compile(r"^def"),                    "DEF"),
(re.compile(r"^[a-zA-Z_][a-zA-Z0-9_]*"), "NAME"),
(re.compile(r"^[0-9]+"),                 "INTEGER"),
(re.compile(r"^$$"), "LPAREN"), (re.compile(r"^$$"),                     "RPAREN"),
(re.compile(r"^\+"),                     "PLUS"),
(re.compile(r"^:"),                      "COLON"),
(re.compile(r"^,"),                      "COMMA"),
(re.compile(r"^\s+"),                    "INDENT"),
]

def match(i, line):
start = line[i:]
for regex, token in TOKENS:
match = regex.match(start)
if match:
begin, end = match.span()
return None, start, None

script = []

for line in code:
i = 0
while i < len(line):
token, string, end = match(i, line)
assert token, "Failed to match line %s" % string
if token:
i += end
script.append((token, string, i, end))

print(script)


[('DEF', 'def', 3, 3), ('INDENT', ' ', 4, 1), ('NAME', 'hello', 9, 5),
('LPAREN', '(', 10, 1), ('NAME', 'x', 11, 1), ('COMMA', ',', 12, 1),
('INDENT', ' ', 13, 1), ('NAME', 'y', 14, 1), ('RPAREN', ')', 15, 1),
('COLON', ':', 16, 1), ('INDENT', '    ', 4, 4), ('NAME', 'print', 9, 5),
('LPAREN', '(', 10, 1), ('NAME', 'x', 11, 1), ('INDENT', ' ', 12, 1),
('PLUS', '+', 13, 1), ('INDENT', ' ', 14, 1), ('NAME', 'y', 15, 1),
('RPAREN', ')', 16, 1), ('NAME', 'hello', 5, 5), ('LPAREN', '(', 6, 1),
('INTEGER', '10', 8, 2), ('COMMA', ',', 9, 1), ('INDENT', ' ', 10, 1),
('INTEGER', '20', 12, 2), ('RPAREN', ')', 13, 1)]


挑战练习

__init__

scan

match

peek

push

研究性学习

• 安装pytest-cov库，并使用它来测量自动化测试的覆盖率。
• 使用pytest-cov的结果来改进自动化测试。

深入学习

• 正则表达式是有限状态机。
• 你可以将小型有限状态机精确地组合成更大更复杂的有限状态机。
• 匹配许多小型正则表达式的有限状态机组合，操作方式每个正则表达式一样，并且效率更高。

• What the f*ck Python中文版

leisurelicht python 70页 2019年5月26日
7300

• Scapy 中文文档

wizardforcel python 10页 2018年5月3日
17

• Python方向综合面试题

jackfrued python 115页 2019年5月26日
35

• 机器学习基础笔记

zhjunqin tensorflow python 43页 2018年6月2日
0