在 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']
如您所见,存在很多问题。几个主要问题是:
- 空格没有完全删除
- 某些标记未正确拆分(即“\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)
这会将源代码分成几行,对每一行进行标记,然后使它们成为一个列表,每行之间有 \n
s。
我正在尝试标记以下代码:
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']
如您所见,存在很多问题。几个主要问题是:
- 空格没有完全删除
- 某些标记未正确拆分(即“\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)
这会将源代码分成几行,对每一行进行标记,然后使它们成为一个列表,每行之间有 \n
s。