嘿伙计们,我正在努力了解有关词法分析者的一些概念。我理解在编译器中使用词法分析器将字符串中的单个字符分隔为称为标记的形式。但令我困惑的是匹配部分。我不明白为什么我们需要将字符匹配到相应的位置。
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循环之后,我不太清楚代码试图做什么。为什么我们必须将字符与位置匹配?
答案 0 :(得分:3)
一个相当传统的词法分析器可以像这样工作:
"
吗?然后尝试获取字符串您可以使用正则表达式,而不是一次检查单个字符。
了解手写词法分析器如何工作的最佳方法是(IMO)找到简单的现有词法分析器并尝试理解它们。
答案 1 :(得分:0)
它与“位置字符”不匹配。给出“pos”参数只在“字符”字符串的一部分中搜索模式 - 从index = pos到end。因此代码尝试将给定顺序的给定标记与给定字符串匹配。在字符串中找到令牌后,下一个令牌仅与字符串的剩余部分匹配。 严格来说,它不是词法分析器,因为它比词法分析者应该做的更多(参考Joachim Pileborg的回答或Lexer的definition)。