| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1550 人关注过本帖
标题:把一种语言解释成另一种语言的问题,请教字符串处理高手
取消只看楼主 加入收藏
静夜思
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:济南的冬天
等 级:管理员
威 望:11
帖 子:8902
专家分:2567
注 册:2004-3-25
结帖率:100%
收藏
已结贴  问题点数:100 回复次数:4 
把一种语言解释成另一种语言的问题,请教字符串处理高手
问题原型:判断字符串A是否在字符串B中,也就是判断字符串B是否包含字符串A

如果是C语言,可以定义一个函数is_in,然后用函数判断
if(is_in(A,B))

有些解释型语言有更人性化的表达方式:
if(A in B)
已经很接近自然语言了。

问题需求:把 if(A in B) 解释成 if(is_in(A, B)) ,以便于运行

如果仅仅是 if(A in B) 解释成 if(is_in(A, B)) 很简单,但A和B有时候并不一定是变量名

也有可能是表达式:
if((A1+A2) in (B1+B2)) 解释成 if(is_in((A1+A2), (B1+B2)))
if("(A1)" in "(A1)(B2)") 解释成 if(is_in("(A1)", "(A1)(B2)"))
if(A in join(B1, B2)) 解释成 if(is_in(A, join(B1, B2)))
这样怎么做呢?可以用正则表达式

=====================================  2012-09-07 13:48更新  ==============================================
回复6楼:
对,就是做解释器,用php实现python的解释器,用php把python解释(编译)成php,用c语言也可以,步骤可能复杂点。卡在上面的问题上了。进度会在https://www.bccn.net/group/php/ 公布,欢迎感兴趣的朋友一起交流,做出雏形以后开源。


搜索更多相关主题的帖子: 表达式 字符串 表达方式 
2012-09-07 09:01
静夜思
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:济南的冬天
等 级:管理员
威 望:11
帖 子:8902
专家分:2567
注 册:2004-3-25
收藏
得分:0 
以下是引用zklhp在2012-9-7 11:36:00的发言:

接分

(\([^ ]+\)[ ]+in[ ]+\(.+\)) -> (is_in(\1, \2))

如果只是正则表达式替换的话上面的这个可以替换例子 其他的我就没试了

顺便 这个是emacs里写的 貌似和php的正则格式不大一样 这里 \(\) 是引用 ( 就是普通括号 如果环境变了表达式也得相应变

补充

貌似上面的没处理tab 比如下面这样的。。 不过我估计正常人不会写这样的东东



应该能看出来哪是空格 哪是tab罢

那 这个正则貌似可以

(\([^     ]+\)[     ]+in[     ]+\(.+\)) -> (is_in(\1, \2))

emacs里直接打tab就能匹配tab 其他的怎么弄的我也不知道 是\t么 还是上面说的 换环境得根据相应的环境来

坏了 发出来tab变空格了。。。

(\([^ \t]+\)[ \t]+in[ \t]+\(.+\)) -> (is_in(\1, \2))
用这个在线平台演示吧,比较方便
这个确实可以匹配 http://www.

被匹配的括号里面也可能有空格 (A1   +   A2) in (B1+B2),这样就匹配不了了 http://www.

还有可能是括号层层嵌套,在表示优先级的时候经常用到: ((( A1 + A2 )* (A3 + A4))/A5)   in  (B1+B2)
也可能A和B都是函数调用    fun1("((( A1 + A2 )* (A3 + A4))/A5)")    in    fun2("if A in B")

畅所欲言
2012-09-07 18:24
静夜思
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:济南的冬天
等 级:管理员
威 望:11
帖 子:8902
专家分:2567
注 册:2004-3-25
收藏
得分:0 
以下是引用pangding在2012-9-7 19:11:10的发言:

如果是带括号的或者是函数调用之类的,用检查括号的匹配性吗?
用,感觉这是最难的地方,函数调用,函数参数可能是字符串,里面什么字符都有。括号层层嵌套,需要准确找到跟它匹配的那个。

fun1("in or not in, (((   (((((")    in      fun2("(((\"((\'((")

就像一些编辑器的高亮括号功能,光标移动到右括号,左括号同时高亮,哪怕里面有包含的再多层括号。不知道有没有现成的算法。

畅所欲言
2012-09-07 19:14
静夜思
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:济南的冬天
等 级:管理员
威 望:11
帖 子:8902
专家分:2567
注 册:2004-3-25
收藏
得分:0 
想到一个有些笨的方法,定义一个计数器变量,初始值,从左向右,遇到一个左括号加1,遇到一个右括号减1,遇到字符串直接跳过去。当计数器减到0的时候说明找到左括号的匹配括号了。实现起来有些麻烦,如果用正则直接匹配出来就好了。

畅所欲言
2012-09-07 19:29
静夜思
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:济南的冬天
等 级:管理员
威 望:11
帖 子:8902
专家分:2567
注 册:2004-3-25
收藏
得分:0 
回复 22楼 stophin
高手,这种方式运行速度比正则表达式更快,正则只是写起来方便。真正的解释器应该就是用的这种方式。

畅所欲言
2012-09-08 22:37
快速回复:把一种语言解释成另一种语言的问题,请教字符串处理高手
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023637 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved