Python 如何实现标记器和解析器?

Python 如何实现标记器和解析器?,python,Python,我想做一个标记器,然后用python做一个解析器 标记器的思想是转换单词列表中的字符串 如果我的字符串是“(定义x5)(+(*2x)7)” 标记器应该输出 ['(', 'define', 'x', '5', ')', '(', '+' , '(', '*', '2', 'x',')', '7', ')'] 然后,解析器应将该列表转换为: [('define', 'x', 5) , ('+', ('*', 2, 'x'), 7)] 我有点迷路了,不知道如何开始 我所拥有的只是: def tok

我想做一个标记器,然后用python做一个解析器

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

如果我的字符串是
“(定义x5)(+(*2x)7)”

标记器应该输出

['(', 'define', 'x', '5', ')', '(', '+' , '(', '*', '2', 'x',')', '7', ')']
然后,解析器应将该列表转换为:

[('define', 'x', 5) , ('+', ('*', 2, 'x'), 7)]
我有点迷路了,不知道如何开始

我所拥有的只是:

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

您应该从思考问题开始,而不是编写代码

特别是,想想你的“话”到底是什么。你的各种词是什么?请特别注意可以使用多个字符的单词。你怎么能认出那类词的开头?你怎么能认出一个连续词,怎么能认出这个词的结尾?另外,在构造一个词时,究竟什么是错误

当你对所有这些问题都有答案后,你就可以考虑开始代码了。在此之前,您不知道要编写什么代码

我们没有您的所有规格,因此即使我们愿意,我们也无法为您回答这些问题。我们可以根据您的示例进行猜测,但它们只是猜测

@EduardoRibeiro,“我只是不知道如何添加空格”--所以,是这样的 你只想知道这些吗?——栅栏


是的,如何在“(“and”)前后添加空格–Eduardo 里贝罗

我会选择
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之间的空间 )但是你给了我一个大概的想法,谢谢你——爱德华多·里贝罗13 几分钟前

其中:

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

这是tokenizer的代码

遍历字符串并查看字符属于哪个类别。我们不编写代码,只调试它。因为这里没有什么需要调试的,所以我们无法回答您的问题。Megalng,您所说的类别是什么意思?对于标记器,我不需要查看它是否是字符。另外,最简单的方法是在“(”中添加一个空格,然后使用split函数,对吗?我只是不知道如何添加空格spaces@EduardoRibeiro,“我只是不知道如何添加空格”--那么,你只想知道这些吗?是的,我如何在“(”和“)之前和之后添加空格'因为即使我最后得到了额外的空格,“拆分”函数也会忽略它们,留下我需要的单词。现在,我只想在空格之间拆分字符,这样我就可以拥有要操作的“单词”列表。最简单的方法是在(“所以我可以使用拆分function@EduardoRibeiro:但您的示例右括号前也没有空格(
)“
。这也是你思考过程的一部分——你是否保证在方便你的地方有空格?你确定只有括号会缺少周围的空格吗?同样,你需要完整的问题说明或更多的上下文才能回答这些问题。但这不是你最初的问题,所以我觉得有点内疚。这不起作用,因为我需要5到7之间的空间,但你给了我大致的想法,谢谢you@EduardoRibeiro你只需将
c+'
更改为
'+c+'
,就可以了。@EduardoRibeiro,你是什么意思<代码>>>>定义扩展器(exp):字符=(“(”,“)”)返回“”。连接(如果c不在字符中,则c为“+c+”,对于exp中的c为“+c+”)>>>扩展器((定义x 5)(+(*2 x)7)”)(定义x 5)(+(*2 x)7)扩展器((定义x 5)”)返回定义x 5“代码”有错误缩进,因此根本不会运行。这个“答案”实际上并没有回答这个问题。即使你写了问题和答案也是如此。请将问题和答案编辑得更清楚。如果你这样做,你可能会得到更多的选票。你也没有提到我在回答中提出的任何问题。你可以在这里回答你自己的问题,但答案应该是一个真正的答案。
>>> expander("(define x 5) ( + (* 2 x) 7)")
' ( define x 5 )   (  +  ( * 2 x )  7 ) '
def expander(a):
s=a.replace('(',' ( ')

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

return t

def tokenizer(a):

s=expander(a)

final=s.split()

return final