嘿,伙计们,我想了解一些关于lexers的概念。我知道编译器中使用lexer将字符串中的单个字符分隔成称为标记的形式。但让我困惑的是匹配部分。我不明白为什么我们需要将字符匹配到相应的位置。在
import sys
import re
def lex(characters, token_exprs):
pos = 0
tokens = []
while pos < len(characters):
match = None
for token_expr in token_exprs:
pattern, tag = token_expr
regex = re.compile(pattern)
match = regex.match(characters, pos)
if match:
text = match.group(0)
if tag:
token = (text, tag)
tokens.append(token)
break
if not match:
sys.stderr.write('Illegal character: %s\n' % characters[pos])
sys.exit(1)
else:
pos = match.end(0)
return tokens
这是我不完全理解的代码。在for循环之后,我不太理解代码试图做什么是的。为什么我们要把角色和位置匹配吗?在
与“位置不匹配”。指定“pos”参数是为了只在“characters”字符串的一部分中搜索模式-从index=pos开始到结束。因此,代码尝试按照给定的顺序将给定的标记与给定的字符串匹配。在字符串中找到标记后,下一个标记只与字符串的其余部分匹配。 严格地说,这并不是一个lexer,因为它做的比lexer应该做的要多一些(参考joachimpileborg的回答或lexer的definition)。在
一个相当传统的lexer可以这样工作:
"
?然后试着弄一根绳子当然,您可以使用正则表达式,而不是一次检查单个字符。在
学习手写lexer如何工作的最好方法是(IMO)找到现有的简单lexer并尝试理解它们。在
相关问题 更多 >
编程相关推荐