2011-03-27 7 views
6

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.

+1

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

+0

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

Respuesta

6

exp() es una función PHP incorporada. No puedes definirlo bajo ese nombre.

No debería haber ninguna razón para utilizar el modismo if(!function_exists(' en las aplicaciones PHP normales. (A menudo se utiliza más como una solución cuando chocan incluyen secuencias de comandos o funciones idénticas se declaran en diferentes lugares.)


Otro problema sintaxis que he notado es el uso por parte del operador OR. El OR lógico debe ser || o simplemente or.

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

Me siento un poco tonto por no mirar eso. Muchas gracias. Limpié el código, usé O lógico y eliminé la función de llamadas existentes y ahora estoy comprobando para asegurarme de que todo funciona. – Seephor

+0

¿Terminó funcionando después de limpiarlo? –

1

También hay una función llamada exp() en PHP ya. Puede prefijar los nombres de sus funciones de alguna manera, o es mejor usar clases para evitar colisiones de nombres.

Cuestiones relacionadas