我在做一个编译器 翻译python代码到perl代码 在python调用函数时 我想知道怎么用正则表达式匹陪

我在做一个编译器翻译python代码到perl代码在python调用函数时我想知道怎么用正则表达式匹陪函数里面的变量我的问题是line=re.sub(“a,b”,"ab"... 我在做一个编译器 翻译python代码到perl代码 在python调用函数时
我想知道怎么用正则表达式匹陪函数里面的变量

我的问题是 line = re.sub(“a,b”, "ab", line)

当我要提取出来 sub函数的三个变量时 (“a,b”, "ab", line)
我想用split(",") 把三部分 分开

可是 第一个字符串如果也包含 逗号 , 的话 就会产生错误的结果
有什么好办法么?
展开
 我来答
ubuntusir
2012-04-17 · TA获得超过712个赞
知道小有建树答主
回答量:181
采纳率:0%
帮助的人:104万
展开全部
可以用正则表达式先匹配出,带引号的变量
使用split(',')分开,在结果的列表中,找到不带引号的变量。合并后,就是完整的变量表了。
a = r'"a,b","ab",line' #原始变量字符串
arg = re.findall(r'\".+?\"',a) #找出带引号的变量
lst = a.split(',') #原始变量字符串,使用逗号分开
for x in in lst: #找到变量列表中不含引号的字符串
if '\"' not in x:
arg.append(x) #追加入变量参数列表
这样,arg就是你要的变量列表了
追问
可是有的时候变量很复杂 比如  print  “abc” + a , r' "a,b,c" ' , "abc" + a + "abc"
print 后面有三个变量
此时 逗号不可靠 引号也不可靠~
编译器平时是怎么分析出来几个变量的
追答
这个比较复杂了,首先是关键字解析了,解析了关键字以后,调用关键字想关的语法结构,然后根据Python的缩进规则,才能完整的解析出变量来。
我没做过,但是我觉得这也应该是可行的。
kaisa1028
2012-04-17 · TA获得超过1.1万个赞
知道大有可为答主
回答量:5429
采纳率:28%
帮助的人:2581万
展开全部
这样的compiler一般用ast然后walk你的python代码。
你要只是按string处理的话,等于自己重新写一个parser,费力不讨好的。
追问
多谢~ 再追问一下
我现在这个作业项目 需要用perl来写
我如果用perl把 python代码的每一行 从perl里调用python ast程序的话
ast 能单独分析一行python 并且返回变量么~
追答
你要做compiler的话不要一行一行的翻译,最好是应该按ast的node来翻译,
比如你那一行程序的语法树就是:Assign(targets=[Name(id='line', ctx=Store())], value=Call(func=Attribute(value=Name(id='re', ctx=Load()), attr='sub', ctx=Load()), args=[Str(s='a,b'), Str(s='ab'), Name(id='line', ctx=Load())], keywords=[], starargs=None, kwargs=None))
这里面你就知道Call这个节点的args里是说你的那个re.sub的三个arguments的。
ast里面有一个NodeVisitor类,这个类可以walk每一个ast的node,然后调用一个visitor()方法,你可以继承这个类,override这个visitor(),然后在这里面输出你的翻译结果。

另外:你确定你的作业是要求必须用perl写python to perl的compiler吗?一般这样的compiler都是把自己翻译成外语,我好像还没见过把外语翻译成自己的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
matlab2000
2012-04-16 · TA获得超过2323个赞
知道大有可为答主
回答量:1678
采纳率:100%
帮助的人:1058万
展开全部
我觉得光用正则表达式搞不定,最好加点词法分析和语法分析,比如pyparsing库什么的。就可以分析出c声明和函数,看你的需求了。否则你光是用正则表达式去匹配,肯定有很多情况考虑不到的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式