En lo que se refiere a la validación, las siguientes fichas de personajes son válidos:
operator: [/*+-]
funcs: (a\(|b\()
brackets: [()]
numbers: \d+(\.\d+)?
space: [ ]
una validación simple entonces podría comprobar si la cadena de entrada coincide con cualquier combinación de estos patrones. Debido a que el token funcs
es bastante preciso y que no entre en conflicto tanto con otras fichas, esta validación debe ser bastante estable w/o la necesidad de implementar cualquier sintaxis/gramática ya:
Sólo
$tokens = array(
'operator' => '[/*+-]',
'funcs' => '(a\(|b\()',
'brackets' => '[()]',
'numbers' => '\d+(\.\d+)?',
'space' => '[ ]',
);
$pattern = '';
foreach($tokens as $token)
{
$pattern .= sprintf('|(?:%s)', $token);
}
$pattern = sprintf('~^(%s)*$~', ltrim($pattern, '|'));
echo $pattern;
si toda la cadena de entrada partidos contra el patrón basado en token, valida.Aún podría ser PHP sintácticamente mal, puesto que puede asegurarse de que sólo es construir sobre los tokens especificados:
~^((?:[/*+-])|(?:(a\(|b\())|(?:[()])|(?:\d+(\.\d+)?)|(?:[ ]))*$~
Si se construye el patrón de forma dinámica - como en el ejemplo - que es capaz de modificar sus fichas de idioma en otro momento en más fácilmente.
Además, este puede ser el primer paso para su propio tokenizador/lexer. La secuencia de token se puede pasar a un analizador que puede validarlo e interpretarlo sintácticamente. Esa es la parte user187291 wrote about.
Como alternativa a escribir un analizador completo de lexer +, y necesita validar la sintaxis, también puede formular su gramática basada en tokens y luego hacer una gramática de símbolo regex basado en la representación del token de la entrada.
Los tokens son las palabras que usa en su gramática. Tendrá que describir la definición de paréntesis y función más precisamente que en tokens, y el tokenizer debería seguir reglas más claras que token reemplaza a otro token. El concepto se describe en another question of mine. Utiliza expresiones regulares también para la formulación de la gramática y la validación de la sintaxis, pero aún no se analiza. En su caso, eval
sería el analizador que está utilizando.
¿Te importa el orden de esas posibles entradas? – hoppa
Se debe agregar a su pregunta un ejemplo de la función que permitiría y una función que no debería aprobar. Tenga en cuenta que el uso de eval no se debe tomar a la ligera. –
Es por eso que quiere desinfectar de antemano sospecho;) – hoppa