miarę walidacja jest zaniepokojony, następujące żetony postaci są ważne:
operator: [/*+-]
funcs: (a\(|b\()
brackets: [()]
numbers: \d+(\.\d+)?
space: [ ]
Prosta walidacja może następnie sprawdzić, czy ciąg wejściowy dopasowuje dowolną kombinację tych wzorów. Ponieważ funcs
żeton jest bardzo precyzyjne i nie kolidować wiele innych tokenów, to walidacja powinna być dość stabilna w/o konieczności wykonania jakichkolwiek składni/gramatyki już:
$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;
Tylko jeśli cały ciąg wejściowy mecze przeciwko wzór oparty na tokenie, sprawdza poprawność.To wciąż może być składniowo źle PHP, umieścić można zapewnić, że tylko opierać się na określonych tokeny:
~^((?:[/*+-])|(?:(a\(|b\())|(?:[()])|(?:\d+(\.\d+)?)|(?:[ ]))*$~
Jeśli budować wzorzec dynamicznie - jak na przykład - jesteś w stanie zmienić swoje żetony językowe później na łatwiejszym.
Dodatkowo może to być pierwszy krok do własnego tokenizera/lexera. Strumień tokenów może następnie zostać przekazany do analizatora składni, który może je zweryfikować i zinterpretować. To jest część user187291 wrote about.
Alternatywnie do napisania pełnego lexera + analizatora składni i musisz sprawdzić poprawność składni, możesz również sformułować swoją gramatykę w oparciu o tokeny, a następnie utworzyć gramatykę opartą na regex na tokenowej reprezentacji danych wejściowych.
Tokeny to słowa, których używasz w swojej gramatyce. Konieczne będzie dokładniejsze opisanie nawiasów i definicji funkcji w tokenach, a tokenizer powinien przestrzegać bardziej przejrzystych reguł, których token zastępuje inny token. Pojęcie jest opisane w another question of mine. Używa również regex do formułowania gramatyki i sprawdzania składni, ale nadal nie parsuje. W twoim przypadku eval
będzie parserem, z którego korzystasz.
Czy interesuje Cię kolejność możliwych wejść? – hoppa
Należy podać przykład funkcji, którą można dopuścić, a funkcja, która nie powinna przejść, powinna zostać dodana do pytania. Uwaga: nie należy lekceważyć korzystania z eval. –
To dlatego chce najpierw zdezynfekować podejrzewam;) – hoppa