[100分-这个有点难度] 关于PHP解析分支结构语法问题! 我用eval试过, 不太好, 经常报错, 如果那位有整体的语法解析类能给一个就更好了! 谢谢了! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不知道你说什么?if($a=="a"){name="tom";}elseif($a==b){name=="jay";}else{name="hello";} 其实就是想要找一个能解析某种特定语法的PHP类,比如能解析 类C语言. 直接看php帮助手册,写得很清楚啊~ 借助语法分析器的思想。比如yacc 本来PHP就是解释型的语言,如果再写一个分析语法的功能会不会把速度降低很多呢? 要解析的内容: {if:(表达式)} ... 111{else} ... 222{end if} 1、获得所有{}里的内容以及 {if:(表达式)} {else} {end if} 之间的内容,存到一个数组里。array[]这时候:array[0]={if:(表达式)}array[1]=... 111array[2]={else} array[3]=... 222array[4]={end if}2、获得array[]的个数,并执行循环。循环开始:$i=03、如果array[$i]中的表达式为真。4、则执行array[$i+1],如输出。5、array[$i]中的表达式为假.6、则执行array[$i+2]7、若array[$i+4]为{else}.8、则继续循环。9、若array[$i+4]为{end if}.则结束循环。循环结束。 把{} 内的和{} 外的用两个不同的数组表示,能更好的控制。因为switch的出现,才想到的。{switch:(表达式)} {case:值1} ... 111{case:值2} ... 222{default} ... 333{end switch}1、第一步一样。2、不同的是array[0]={switch:(表达式)}array[1]={case:值1} arrayb[0]=... 111array[2]={case:值2} arrayb[1]=... 2223、1、获得array[0]的表达式。循环开始。$i=02、获得array[$i+1]的表达式。3、若相等,则执行$i.4、若不等,则继续5、若发现default,则执行$i6、若发现end switch 则结束。7、继续循环。循环中的顺序可能需要调整下。 那PHP用什么函数来处理表达式呢?比如 $i=0 这个表达式, 是用eval吗? 好象又不是。试过总报错。 是在做模板引擎吗?若是,可参考成熟的模板引擎的写法识别形如 {....} 的串是很容易的$code =<<< CODE{if:(表达式)} ... {else} ... {end if} {switch:(表达式)} {case:值1} ... {case:值2} ... {default} ... {end switch} CODE;$ar = preg_split("/({.*?})/s", $code, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);print_r($ar);Array( [0] => {if:(表达式)} [1] => ... [2] => {else} [3] => ... [4] => {end if} [5] => [6] => {switch:(表达式)} [7] => [8] => {case:值1} [9] => ... [10] => {case:值2} [11] => ... [12] => {default} [13] => ... [14] => {end switch} [15] => )接下来做什么,你没说,我也就不知道了 用正则表达式取出这些内容已经没问题了,最关键的问题是PHP如何来处理分支结构中的表达式呢?比如:{if:(表达式)}{switch:(表达式)}用什么办法/函数能对该表达式进行逻辑运算呢? 编译原理-分析法和逆波兰式像你这种直接向Php转换就可以了。复杂的你又做不来。Js的例子:http://code.google.com/p/jssmarty/ php二维数组按某个值数量多的排序 如何限制用户的访问次数?只有cookies和ip吗 语法错误 PHP 调用Win系统服务程序的问题 读取树状数据的方法 我想要一个这样的功能,删除整个网站,用PHP写的 请教高手一个GD库的问题 庆贺xizi2002成为php版主, xizi2002将于大家共创辉煌~~~~~~呵呵~~ echo "20||30||20"<"20||5||0";为什么结果会等于1?? php 中 echo 和 print 的区别? 菜鸟求助 如和获取客户端COOKIE并限制该客户端24小时不能在访问答题?
if($a=="a"){
name="tom";
}elseif($a==b){
name=="jay";
}else{
name="hello";}
比如yacc
{if:(表达式)}
... 111
{else}
... 222
{end if} 1、获得所有{}里的内容以及 {if:(表达式)} {else} {end if} 之间的内容,存到一个数组里。array[]
这时候:
array[0]={if:(表达式)}array[1]=... 111array[2]={else} array[3]=... 222array[4]={end if}
2、获得array[]的个数,并执行循环。循环开始:$i=03、如果array[$i]中的表达式为真。
4、则执行array[$i+1],如输出。
5、array[$i]中的表达式为假.
6、则执行array[$i+2]
7、若array[$i+4]为{else}.
8、则继续循环。
9、若array[$i+4]为{end if}.则结束循环。循环结束。
{case:值1}
... 111
{case:值2}
... 222
{default}
... 333
{end switch}1、第一步一样。
2、不同的是
array[0]={switch:(表达式)}array[1]={case:值1} arrayb[0]=... 111array[2]={case:值2} arrayb[1]=... 2223、1、获得array[0]的表达式。
循环开始。$i=0
2、获得array[$i+1]的表达式。
3、若相等,则执行$i.
4、若不等,则继续
5、若发现default,则执行$i
6、若发现end switch 则结束。
7、继续循环。
循环中的顺序可能需要调整下。
若是,可参考成熟的模板引擎的写法识别形如 {....} 的串是很容易的
$code =<<< CODE
{if:(表达式)}
...
{else}
...
{end if} {switch:(表达式)}
{case:值1}
...
{case:值2}
...
{default}
...
{end switch}
CODE;$ar = preg_split("/({.*?})/s", $code, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);print_r($ar);Array
(
[0] => {if:(表达式)}
[1] =>
... [2] => {else}
[3] =>
... [4] => {end if}
[5] =>
[6] => {switch:(表达式)}
[7] => [8] => {case:值1}
[9] =>
... [10] => {case:值2}
[11] =>
... [12] => {default}
[13] =>
... [14] => {end switch}
[15] =>
)接下来做什么,你没说,我也就不知道了
最关键的问题是PHP如何来处理分支结构中的表达式呢?比如:
{if:(表达式)}{switch:(表达式)}用什么办法/函数能对该表达式进行逻辑运算呢?
http://code.google.com/p/jssmarty/