Я пытаюсь написать анализатор рекурсивного спуска на PHP для следующего EBNF:
EXP ::= < TERM > { ( + | - ) < TERM > }
TERM ::= < FACTOR > { ( * | / ) < FACTOR > }
FACTOR ::= ( < EXP > ) | < DIGIT >
DIGIT ::= 0 | 1 | 2 | 3
Я следовал этому руководству, которое мне рекомендовали по аналогичному вопросу. (искал перед тем как написать)
По большей части я понимаю, как это работает, и понимаю грамматику. Я думаю, что проблема в моем синтаксисе. Я новичок в PHP, поэтому ссылаюсь на W3Schools. В настоящее время я получаю следующую ошибку с моим кодом:
Warning: Wrong parameter count for exp() .... on line 101
Я пытался найти эту ошибку и не очень повезло. Я читал несколько сообщений о том, что люди передают неверный тип параметра, но у меня нет никаких параметров, установленных для этой функции. Есть ли что-то в PHP, которое мне здесь не хватает?
Ниже приведен мой код, я думаю, что логика верна, поскольку я основывал его на дереве синтаксического анализа для грамматики. Ввод $ будет поступать из поля формы на HTML-странице. Я также взял функцию str_split из другого поста, когда обнаружил, что в PHP4 она не встроена.
<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>
Итак, в основном я хочу знать, что вызывает эту ошибку и почему, и я на правильном пути с точки зрения создания этого парсера.
Я ценю любые комментарии, предложения, критику, водные шары и помидоры. Спасибо, что нашли время, чтобы прочитать мой пост. Хорошего дня/ночи.