嘿,伙计们,我在试着理解一些关于词汇者的概念。我了解到,在编译器中使用词汇将字符串中的单个字符分隔成称为记号的形式。但让我困惑的是匹配的部分。我不明白为什么我们需要将字符匹配到相应的位置。
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循环之后,我不太了解代码试图实现什么do.Why,我们必须将字符与位置匹配吗?
发布于 2013-08-15 16:28:07
一个非常传统的lexer可以像这样工作:
"吗?那就试着得到一个字符串
- Otherwise, is it a valid operator sequence?
当然,您可以使用正则表达式来代替一次检查单个字符。
学习手写词汇的最佳方法是(IMO)找到简单的现有词汇者,并尝试理解他们。
发布于 2013-08-15 16:31:55
它不匹配“字符与位置”。"pos“参数只用于在”字符“字符串的一部分中寻找模式--从index=pos开始到结束。因此,代码试图按照给定的顺序将给定的令牌匹配到给定的字符串。在字符串中找到令牌之后,下一个令牌只匹配到字符串的其余部分。严格地说,这并不是一个雷克萨斯,因为它做的比一个雷克萨斯应该做的(参考Joachim Pileborg的答案或雷克萨斯的定义)。
https://stackoverflow.com/questions/18257008
复制相似问题