脚本宝典收集整理的这篇文章主要介绍了PHP中EBNF的递归下降解析器,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
Exp ::= < TERM > { ( + | - ) < TERM > } TERM ::= < FACTOR > { ( * | / ) < FACTOR > } FACTOR ::= ( < EXP > ) | < DIGIT > DIGIT ::= 0 | 1 | 2 | 3@H_502_2@我跟着这个guide,我看到推荐的类似问题. (我发布之前搜索过)
在大多数情况下,我了解它是如何工作的,我理解语法.我认为问题在于我的语法.我是PHP的新手,所以我一直在引用W3Schools.我目前在使用我的代码时遇到以下错误:
Warning: Wrong parameter count for exp() .... on line 101@H_502_2@我试图查找这个错误并没有太多运气.我读了一些关于传入错误参数的人的帖子,但我没有为该函数设置任何参数.我有什么关于PHP的东西吗?
下面是我的代码,我认为逻辑是正确的,因为我基于语法的解析树. $input将来自HTML页面上的表单框.当我发现PHP4没有内置时,我也从不同的帖子中获取了str_split函数.
<html> <body> <?PHP if(!function_exists("exp")){ function exp(){ term(); while($token == "+" | $token == "-"){ if($token == "+"){ match("+"); term(); } if($token == "-"){ match("-"); term(); } } }//end exp } if(!function_exists("term")){ function term(){ factor(); while($token == "*" | $token == "/"){ if($token == "*"){ match("*"); factor(); } if($token == "/"){ match("/"); factor(); } } }//end term } if(!function_exists("factor")){ function factor(){ if($token == "("){ match("("); exp(); if($token == ")") match(")"); } else if($token == 0|1|2|3){ if($token == 0) match(0); if($token == 1) match(1); if($token == 2) match(2); if($token == 3) match(3); } else error(); }//end factor } if(!function_exists("match")){ function match($exPEcted){ if($token == $expected) nextToken(); else error(); }//end match } if(!function_exists("next_Token")){ function nextToken(){ $next++; $token = $tokenStr[$next]; if($token == "$"); legal(); } } if(!function_exists("error")){ function error(){ echo "Illegal token stream,try again"; } } if(!function_exists("legal")){ function legal(){ echo "Legal token stream,congrats!"; } } if(!function_exists('str_split')) { function str_split($string,$split_length = 1) { $array = explode("\r\n",chunk_split($string,$split_length)); array_pop($array); return $array; } } $tokenStr = str_split($input); $next = 0; $token = $tokenStr[0]; exp(); ?> </body> </html>@H_502_2@
exp()
是内置的PHP函数.您无法在该名称下定义它.
您应该没有理由使用if(!function_exists(‘普通程序中的惯用法.)当包含脚本冲突或在不同位置声明相同的函数时,它通常更多地用作解决方法.)
我注意到的另一个语法问题是你使用按位OR.逻辑OR应为||或只是或.
while($token == "*" | $token == "/"){@H_502_2@
以上是脚本宝典为你收集整理的PHP中EBNF的递归下降解析器全部内容,希望文章能够帮你解决PHP中EBNF的递归下降解析器所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。