完整 Lexer 跑一遍的四个数
把完整的 Lexer 跑在那段源码上,输出四个数:词数、关键字数、字符串那个词的字符数、最后一个词的列号。
let rate = 12; let msg = "hi there"; total = rate >= 3;
玩具语言的词法规则:关键字 let if else while;标识符以字母或下划线开头;数字是连续的数位;字符串用一对双引号括起来(不含转义);双字符运算符 >= <= == !=;单字符运算符 + - * / = < > ; ( );空白只做分隔。
KEYWORDS = ("let", "if", "else", "while")
TWO = ("==", "!=", ">=", "<=")
ONE = "+-*/=<>;()"
SRC = 'let rate = 12;\nlet msg = "hi there";\ntotal = rate >= 3;'
import re
PAT = re.compile(r'(?:let|if|else|while)\b|[A-Za-z_]\w*|\d+|"[^"]*"'
r'|==|!=|>=|<=|[+\-*/=<>;()]')
toks = [m.group() for m in PAT.finditer(SRC)]
kw = sum(1 for t in toks if t in KEYWORDS)
st = next(t for t in toks if t.startswith('"'))
last_line = SRC.split("\n")[-1]
col = last_line.rfind(";") + 1
print("/".join(str(x) for x in (len(toks), kw, len(st), col)))
全部评论