在 Python 中将代码拆分为令牌 (Lexing)

Split code into tokens (Lexing) in Python

我正在尝试标记以下代码:

foo ::= 5
bar ::= 15
foobar ::= 20

所以输出是:

['foo', '::=', '5', '\n', 'bar', '::=', '15', '/n', 'foobar', '::=', '20' ]

我目前的尝试如下:

reTokens = re.compile(r' ')
tokens = reTokens.split(source)
print(tokens)

然而这打印:

['\n', '', '', '', 'foo', '::=', '5\n', '', '', '', 'bar', '::=', '15\n', '', '', '', 'foobar', '::=', '20\n']

如您所见,存在很多问题。几个主要问题是:

  1. 空格没有完全删除
  2. 某些标记未正确拆分(即“\n”。将 \n 添加到正则表达式中也不能解决问题,因为这会将其从数组中完全删除)。

你可以这样做:

from functools import reduce

lines = source.splitlines()
tokens_list = [line.strip().split() for line in lines]
tokens = reduce(lambda x,y: x + ['\n'] + y, tokens_list)
print(tokens)

这会将源代码分成几行,对每一行进行标记,然后使它们成为一个列表,每行之间有 \ns。