如何实现tokenizer和parser?

时间:2018-05-04 14:03:38

标签: python

我想创建一个tokenizer,然后在python中创建一个解析器。

标记化器的想法是转换单词列表中的字符串。

如果我的字符串是"(define x 5) ( + (* 2 x) 7)"

标记生成器应该输出

['(', 'define', 'x', '5', ')', '(', '+' , '(', '*', '2', 'x',')', '7', ')']

然后解析器应该将该列表转换为:

[('define', 'x', 5) , ('+', ('*', 2, 'x'), 7)]

我有点失落,不知道如何开始。

我只有:

def tokenizer(a):
    final=[]
    return final

3 个答案:

答案 0 :(得分:0)

您应该首先考虑问题,而不是编写代码。

特别要考虑你的"单词"是。你的各种话语是什么?特别注意可以使用多个字符的单词。你怎么能认出那个词的开头?你怎么能认出一个延续,怎么能认出这个词的结尾?那么,究竟什么是构造一个单词的错误?

在得到所有这些问题的答案后,您可以考虑开始编码。在那之前,你不知道要编码什么。

我们没有您的所有规格,因此即使我们愿意,也无法为您回答这些问题。我们可以根据你的例子做出猜测,但他们只会猜测。

答案 1 :(得分:0)

  

@EduardoRibeiro,“我只是不知道如何添加空格” - 所以,是   那你只想知道吗? - palivek

     

是的,如何在'('和')之前和之后添加空格 - Eduardo   Ribeiro的

我会选择listcomp

def expander(exp):
    special = ('(', ')')
    return ''.join(c if c not in special else c + ' ' for c in exp)

哪会给:

>>> expander("(define x 5) ( + (* 2 x) 7)")
'( define x 5)  (  + ( * 2 x)  7) '

修改

  

因为我需要介于5和之间以及介于7和7之间的空间   )但是你给了我一般的想法,谢谢你 - Eduardo Ribeiro 13   分钟前

def expander(exp):
    chars = ('(', ')')
    return ''.join(c if c not in chars else ' ' + c + ' ' for c in exp)

给出了:

>>> expander("(define x 5) ( + (* 2 x) 7)")
' ( define x 5 )   (  +  ( * 2 x )  7 ) '

答案 2 :(得分:-1)

def expander(a):
s=a.replace('(',' ( ')

t=s.replace(')',' ) ')

return t

def tokenizer(a):

s=expander(a)

final=s.split()

return final

这是tokenizer的代码