我想创建一个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
答案 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的代码