Estoy intentando escribir un analizador sintáctico descendente recursivo de PHP para el siguiente EBNF:
recursiva Descenso Analizador de EBNF en PHP
EXP ::= <TERM> { (+ | -) <TERM> }
TERM ::= <FACTOR> { (* | /) <FACTOR> }
FACTOR ::= (<EXP>) | <DIGIT>
DIGIT ::= 0 | 1 | 2 | 3
he seguido este guide que vi recomendados en una pregunta similar. (Busqué antes de publicar)
En general, entiendo cómo funciona y entiendo la gramática. Creo que el problema está dentro de mi sintaxis. Soy nuevo en PHP, así que he estado haciendo referencia al W3Schools. Yo actualmente estoy recibiendo el siguiente error con mi código:
Warning: Wrong parameter count for exp() .... on line 101
He tratado de buscar este error y no he tenido mucha suerte. Leí algunas publicaciones sobre personas que pasan el parámetro incorrecto escrito, pero no tengo ningún parámetro establecido para esa función. ¿Hay algo acerca de PHP que me falta aquí?
A continuación se muestra mi código, creo que la lógica es correcta ya que la he basado en el árbol de análisis gramatical. La entrada $ vendrá de un cuadro de formulario en una página HTML. Yo también recogió la función str_split de un puesto diferente cuando descubrí que PHP4 no lo tiene incorporado.
<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>
Así que, básicamente quiero saber lo que hace que el error y por qué y estoy en el camino correcto en términos de creación de este analizador.
Agradezco cualquier comentario, sugerencia, crítica, water baloons y tomates. Gracias por tomarse el tiempo para leer mi publicación. Que tengas un gran día/noche.
Lo siento, es una suposición descabellada, pero ¿no es eso una especie de choque con una función 'exp()' de las matemáticas: http://php.net/manual/en/function.exp.php? – julkiewicz
Gracias, eso fue exactamente, pero ahora todo se compila correctamente sin salida. Mi suposición es que no está recibiendo la entrada aprobada. ¿Hay algún problema con la forma en que mis funciones acceden a las variables globales? – Seephor