c+的Python解析器+;简单表达

c+的Python解析器+;简单表达,python,regex,parsing,Python,Regex,Parsing,注:python 3.2 我想制作一个python脚本,它将C++简单表达式作为输入,输出与令牌非常相同的表达式。 我模模糊糊地记得我的编译课程,我需要的东西远没有编译器复杂 示例 int& name1=arr1[place1]; int *name2= arr2[ place2]; 应该输出 [ "int", "&", "name1", "=", "arr1", "[", "place1", "]" ] [ "int", "*", "name2", "

注:python 3.2

我想制作一个python脚本,它将C++简单表达式作为输入,输出与令牌非常相同的表达式。

我模模糊糊地记得我的编译课程,我需要的东西远没有编译器复杂

示例

int& name1=arr1[place1];
int *name2=    arr2[ place2];
应该输出

[    "int", "&", "name1", "=", "arr1", "[", "place1", "]"    ]
[    "int", "*", "name2", "=", "arr2", "[", "place2", "]"    ]
空格应该无关紧要,我不希望它们出现在输出中

对于那些知道自己在做什么的人来说,这似乎是一项非常简单的任务,而我却不断地得到垃圾空格或在错误的地方得到除法

我将非常感谢一个快速解决这个问题的方法——对我来说,这看起来真的像一个简单的例子

请注意,我只需要这里显示的表达式。没什么特别的


谢谢

这里有一个发电机,它可能会起作用:

def parseCPP(line):
   line=line.rstrip(";")
   word=""
   for i in line:
       if i.isalnum():
           word+=i
       else:
           if word:
               yield word
               word=""
           if i!=" ":
               yield i
注意,这只是拾取字母数字字符的连续字符串。假定任何非空格字符本身都是运算符/标记


希望这能有所帮助:)

这里有一个发电机,可以实现以下功能:

def parseCPP(line):
   line=line.rstrip(";")
   word=""
   for i in line:
       if i.isalnum():
           word+=i
       else:
           if word:
               yield word
               word=""
           if i!=" ":
               yield i
注意,这只是拾取字母数字字符的连续字符串。假定任何非空格字符本身都是运算符/标记


希望这有帮助:)

在我看来,您需要定义一个“特殊/运算符”字符列表。将这些字符中的任何一个替换为自身加上两侧的空白。使用string.split()将字符串转换为“单词”列表。如果您需要字符串表示,请使用string.join(单词列表“,”)结束,并在前面添加“[”,在后面添加“]”


我几乎肯定遗漏了一些东西,比如寻找要去掉的分号,或者在分解串联表达式时使用的分号。你没有具体说明你一次读了多少个表达。如果您一次读入多个,您可以在分号字符上拆分,然后迭代得到的表达式列表。

在我看来,您需要定义一个“特殊/运算符”字符列表。将这些字符中的任何一个替换为自身加上两侧的空白。使用string.split()将字符串转换为“单词”列表。如果您需要字符串表示,请使用string.join(单词列表“,”)结束,并在前面添加“[”,在后面添加“]”


我几乎肯定遗漏了一些东西,比如寻找要去掉的分号,或者在分解串联表达式时使用的分号。你没有具体说明你一次读了多少个表达。如果你一次读多个,你可以在分号上分裂,然后在结果列表中迭代。

不太熟悉C++,但是你可以使用R.FiDALL和一个特殊字符列表:

lines="""int& name1=arr1[place1];
int *name2=    arr2[ place2];"""
import re
for line in lines.splitlines():
    print(re.findall("[\*\$\[\]&=]|\w+",line))
['int', '&', 'name1', '=', 'arr1', '[', 'place1', ']']
['int', '*', 'name2', '=', 'arr2', '[', 'place2', ']']

不太熟悉C++,但你可以使用R.FiDALL和一个特殊字符列表:

lines="""int& name1=arr1[place1];
int *name2=    arr2[ place2];"""
import re
for line in lines.splitlines():
    print(re.findall("[\*\$\[\]&=]|\w+",line))
['int', '&', 'name1', '=', 'arr1', '[', 'place1', ']']
['int', '*', 'name2', '=', 'arr2', '[', 'place2', ']']

第一步是将空格替换为空白。这是带有“”的“”。然后使用拆分函数。列出特殊字符或单词,并用特殊字符和分隔符替换它们。用分隔符拆分该行。以下是一个例子:

for line in sys.stdin:
    line = line.replace(' ', '')
    line = line.replace('&',',&,')
    a = line.split(',')

第一步是将空格替换为空白。这是带有“”的“”。然后使用拆分函数。列出特殊字符或单词,并用特殊字符和分隔符替换它们。用分隔符拆分该行。以下是一个例子:

for line in sys.stdin:
    line = line.replace(' ', '')
    line = line.replace('&',',&,')
    a = line.split(',')

能展示你已经掌握的代码,大家都很感激。@EliKorvigo我身处一个与世界网络隔绝的军事环境中。无法获取我的代码。无论如何,我认为这将是一个简单的问题,并不需要准备工作。如果这些建议不起作用,请尝试描述您的算法,因为您无法发布代码。您可能可以反复优化正则表达式,以获得所需的近似值。或者,您可以使用或类似的Python库构建一个简单、可读且可维护的lexer。我强烈建议选择2。如果您能展示您已经获得的代码,我们将不胜感激。@EliKorvigo我所处的军事环境与世界网络非常接近。无法获取我的代码。无论如何,我认为这将是一个简单的问题,并不需要准备工作。如果这些建议不起作用,请尝试描述您的算法,因为您无法发布代码。您可能可以反复优化正则表达式,以获得所需的近似值。或者,您可以使用或类似的Python库构建一个简单、可读且可维护的lexer。我强烈建议选项2。你可以假设每行有一个这样的表达式。简单到可以做到这一点,可能有一个聪明的列表理解——似乎每件事都有一个。这是一个简单的建议,我总是先尝试。你可以假设我每行有一个这样的表达式。简单到可以做到这一点,可能有一个聪明的列表理解——似乎每件事都有一个。这是一个简单的建议,这是我经常首先尝试的。虽然示例没有显示,但类似“int a=1;”的内容也是一个有效的表达式,它应该返回['int'、'a'、'='、'1'],但是删除空格会错误地将“int”和“a”合并。这个示例中的想法对我来说是最有益的,我设法让事情发生了。谢谢虽然示例没有显示,但类似“int a=1;”的内容也是一个有效的表达式,它应该返回['int'、'a'、'='、'1'],但是删除空格会错误地合并“int”和“a”。本示例中的想法对我最有利,我成功地实现了一些事情。谢谢