Python中字符流的Lisp标记器

2024-06-17 14:18:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我很喜欢在这里读到彼得·诺维格(Peter Norvig)廉价而欢快的口齿不清翻译:

http://norvig.com/lispy.html

在他的代码中,他使用这个非常简单的函数来标记输入的Lisp代码:

def tokenize(chars):
    "Convert a string of characters into a list of tokens."
    return chars.replace('(', ' ( ').replace(')', ' ) ').split()

我想把它重写成一个可以在流上运行的生成器,类似这样:

^{pr2}$

我勾勒出一个状态机并开始实现它,但它很快变得比预期的复杂。有没有一个我缺少的更简单的方法?在


Tags: of函数代码标记comhttphtmlreplace
1条回答
网友
1楼 · 发布于 2024-06-17 14:18:13

我又试了一次,想出了这个。它还没有经过很好的测试,但目前看来是有效的。在

def tokenise(char_stream):
  c = char_stream.read(1)
  accumulated = []

  while c:
    c_isbracket = c in '()'
    if !c.isspace() and !c_isbracket:
      accumulated.append(c)
    else:
      if accumulated:
        token_str = ''.join(accumulated)
        accumulated = []
        yield token_str
      if c_isbracket:
        yield c

    c = char_stream.read(1)

相关问题 更多 >