我在做一个编译器 翻译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(",") 把三部分 分开
可是 第一个字符串如果也包含 逗号 , 的话 就会产生错误的结果
有什么好办法么? 展开
我想知道怎么用正则表达式匹陪函数里面的变量
我的问题是 line = re.sub(“a,b”, "ab", line)
当我要提取出来 sub函数的三个变量时 (“a,b”, "ab", line)
我想用split(",") 把三部分 分开
可是 第一个字符串如果也包含 逗号 , 的话 就会产生错误的结果
有什么好办法么? 展开
3个回答
展开全部
可以用正则表达式先匹配出,带引号的变量
使用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就是你要的变量列表了
使用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的缩进规则,才能完整的解析出变量来。
我没做过,但是我觉得这也应该是可行的。
展开全部
这样的compiler一般用ast然后walk你的python代码。
你要只是按string处理的话,等于自己重新写一个parser,费力不讨好的。
你要只是按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都是把自己翻译成外语,我好像还没见过把外语翻译成自己的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我觉得光用正则表达式搞不定,最好加点词法分析和语法分析,比如pyparsing库什么的。就可以分析出c声明和函数,看你的需求了。否则你光是用正则表达式去匹配,肯定有很多情况考虑不到的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询