【问题标题】:Split code into tokens (Lexing) in Python在 Python 中将代码拆分为标记(Lexing)
【发布时间】:2015-10-24 21:41:05
【问题描述】:

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

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 添加到正则表达式也不能解决问题,因为这会将其从数组中完全删除)。

【问题讨论】:

    标签: python python-3.x parsing compiler-construction lexical-analysis


    【解决方案1】:

    你可以这样做:

    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。

    【讨论】:

    • Python 3 中是否存在“reduce”
    • 哦,对不起,它是 python 3,对 :) 它在 functools 下。所以你应该写from functools import reduce
    • 在代码的开头。我编辑了我写的代码。
    猜你喜欢
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    相关资源
    最近更新 更多