先数一数句子

👁️ 2 人浏览 💬 0 人评论 ❤️ 添加收藏

(每道题开头都有同一段: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))
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论