先数一数句子
(每道题开头都有同一段:T() 是上一站 lexer 的替身——源码里 token 之间用空格分开,它切成 (kind, text, line, col);show() 把树写成一行:二元运算全加括号,语句之间用 |。)
贯穿的源码(接 compiler_02 那段):
let rate = 12 ;
let msg = "hi" ;
total = rate >= 3 ;还没写 parser,先用最土的办法:数 token 数、数分号(每句一个分号)。
KEYWORDS = ("let", "if", "else", "while")
CMP = (">=", "<=", "==", "!=", "<", ">")
def T(src):
toks = []
for ln, line in enumerate(src.split("\n"), 1):
pos = 0
for w in line.split():
pos = line.index(w, pos)
if w in KEYWORDS:
k = "KEYWORD"
elif w[0] == '"':
k = "STRING"
elif w.isdigit():
k = "NUMBER"
elif w[0].isalpha() or w[0] == "_":
k = "IDENT"
else:
k = "OP"
toks.append((k, w, ln, pos + 1))
pos += len(w)
toks.append(("EOF", "", ln, pos + 1))
return toks
SRC = 'let rate = 12 ;\nlet msg = "hi" ;\ntotal = rate >= 3 ;'
toks = T(SRC)
n = len(toks) - 1
semis = sum(1 for t in toks if t[1] == ";")
print(str(n) + "/" + str(semis))
全部评论