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

时间:2015-10-24 21:41:05

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

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

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无法解决问题,因为这会将其从数组中完全删除)。

1 个答案:

答案 0 :(得分:1)

你可以这样做:

<?php
    $args=array('post_type' => 'partners');
    $query= new WP_Query($args);
while ($query-> have_posts() ) : $query->the_post()?> <div class="col-lg-2 col-md-2 col-sm-4 col-xs-12"> <?php the_title;?> <?php the_post_thumbnail( 'full', array( 'class' => 'innerimages') );?> <?php print get_post_meta ( get_the_ID(), 'description' ); ?> </div> <?php endwhile;?>

将源分为其行,对每行进行标记,然后将它们作为单个列表,每行之间都有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) 个。