gpt4 book ai didi

php - PHP 中 EBNF 的递归下降解析器

转载 作者:可可西里 更新时间:2023-11-01 13:18:28 26 4
gpt4 key购买 nike

我正在尝试用 PHP 为以下 EBNF 编写递归下降解析器:

EXP ::= < TERM > { ( + | - ) < TERM > }
TERM ::= < FACTOR > { ( * | / ) < FACTOR > }
FACTOR ::= ( < EXP > ) | < DIGIT >
DIGIT ::= 0 | 1 | 2 | 3

我关注了这个guide我在类似的问题上看到了推荐。 (我发帖前搜索过)

在大多数情况下,我了解它的工作原理并理解语法。我认为问题出在我的语法中。我是 PHP 新手,所以我一直在引用 W3Schools .我目前的代码出现以下错误:

Warning: Wrong parameter count for exp() .... on line 101

我曾尝试查找此错误,但运气不佳。我读了一些关于人们传递错误参数类型的帖子,但我没有为该函数设置任何参数。我在这里缺少有关 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>

所以基本上我想知道是什么导致了这个错误,为什么以及我在创建这个解析器方面是否走在了正确的轨道上。

我感谢任何评论、建议、批评、水气球和西红柿。感谢您花时间阅读我的帖子。祝你白天/晚上愉快。

最佳答案

exp()是一个内置的 PHP 函数。您不能使用该名称定义它。

你应该没有理由在普通的 PHP 应用程序中使用 if(!function_exists(' 习惯用法。(当包含脚本冲突或在不同位置声明相同的函数时,它通常更多地用作解决方法.)


我注意到的另一个语法问题是您对按位或的使用。逻辑或应该是 || 或只是 or

while($token == "*" | $token == "/"){

关于php - PHP 中 EBNF 的递归下降解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5453356/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com