Bir dize tokenize (PHP) sınırlayıcı tutmak için standart algoritma

3 Cevap php

Ben, belirteçleri içine bir aritmetik ifade bölmek RPN haline dönüştürmek istiyor.

Java isteğe sınırlayıcılarınıda tutabilir StringTokenizer sahiptir. Bu şekilde, ben ayraç olarak operatörleri kullanabilirsiniz. Ne yazık ki, ben Strtok olan PHP, bunu yapmak gerekir, fakat bu sınırlayıcı atıyor, bu yüzden bir şey kendimi demlemek gerekir.

Bu Derleyici Tasarımı 101 için klasik bir ders kitabı örnek gibi geliyor, ama ben burada bazı örgün eğitimden yoksun korkuyorum. Bana işaret edebilir standart bir algoritma var mı?

Benim diğer seçenekleri Lexical Analysis üzerinde okumak için veya mevcut string fonksiyonları ile hızlı ve kirli bir şey rulo vardır.

3 Cevap

Sık sık olduğu gibi, ben sadece bunu yapmak için bir normal ifadeyi kullanabilirsiniz:

$expr = '(5*(7 + 2 * -9.3) - 8 )/ 11';
$tokens = preg_split('/([*\/^+-]+)\s*|([\d.]+)\s*/', $expr, -1,
        PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
$tts = print_r($tokens, true);
echo "<pre>x=$tts</pre>";

Bu (gibi-9.2e-8) üs numaralarını kabul biraz daha çalışma gerektiriyor.

Bu yardımcı olabilir.

Practical Uses of Tokenizer

Herkes bunu gerektiğinde Tamam, PhiLho sayesinde, benim son kod, bu. Bu bile gerçekten kirli değil. :-)

static function rgTokenize($s)
{
    $rg = array();

    // remove whitespace
    $s = preg_replace("/\s+/", '', $s);

    // split at numbers, identifiers, function names and operators
    $rg = preg_split('/([*\/^+\(\)-])|(#\d+)|([\d.]+)|(\w+)/', $s, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

    // find right-associative '-' and put it as a sign onto the following number
    for ($ix = 0, $ixMax = count($rg); $ix < $ixMax; $ix++) {
        if ('-' == $rg[$ix]) {
            if (isset($rg[$ix - 1]) && self::fIsOperand($rg[$ix - 1])) {
                continue;
            } else if (isset($rg[$ix + 1]) && self::fIsOperand($rg[$ix + 1])) {
                $rg[$ix + 1] = $rg[$ix].$rg[$ix + 1];
                unset($rg[$ix]);
            } else {
                throw new Exception("Syntax error: Found right-associative '-' without operand");
            }
        }
    }
    $rg = array_values($rg);

    echo join(" ", $rg)."\n";

    return $rg;
}