Php lua gibi kod okumak

3 Cevap php

I got a question... I got code like this, and I want to read it with PHP.

 NAME
 {
    title
    (
    	A_STRING
    );

    settings
    {
    	SetA( 15, 15 );
    	SetB( "test" );
    }

    desc
    {
    	Desc
    	(
    		A_STRING
    	);

    	Cond
    	(
    		A_STRING
    	);	

    }
 }

Ben istiyorum:

$arr['NAME']['title'] = "A_STRING";
$arr['NAME']['settings']['SetA'] = "15, 15";
$arr['NAME']['settings']['SetB'] = "test";
$arr['NAME']['desc']['Desc'] = "A_STRING";
$arr['NAME']['desc']['Cond'] = "A_STRING";

I don't know how I should start :/. The variables aren't always the same. Can someone give me a hint on how to parse such a file?

Thx

3 Cevap

Dosyaları bu basit iseniz, o zaman kendi Homegrown ayrıştırıcı haddeleme muhtemelen çok daha kolaydır. Sen sonunda zaten lexers ile regex yazma bitireceğiz. Burada hızlı bir hack örnek: (in.txt Yukarıda verilen giriş içermelidir.)

<pre>
<?php

$input_str = file_get_contents("in.txt");
print_r(parse_lualike($input_str));

function parse_lualike($str){    
    $str = preg_replace('/[\n]|[;]/','',$str);
    preg_match_all('/[a-zA-Z][a-zA-Z0-9_]*|[(]\s*([^)]*)\s*[)]|[{]|[}]/', $str, $matches);
    $tree = array();
    $stack = array();
    $pos = 0;
    $stack[$pos] = &$tree;
    foreach($matches[0] as $index => $token){
        if($token == '{'){
            $node = &$stack[$pos];
            $node[$ident] = array();
            $pos++;
            $stack[$pos] =  &$node[$ident];
        }elseif($token=='}'){
            unset($stack[$pos]);
            $pos--;
        }elseif($token[0] == '('){
            $stack[$pos][$ident] = $matches[1][$index];
        }else{
            $ident =  $token;
        }
    }
    return $tree;
}

?>

Hızlı açıklama: onlar gereksiz gibi görünüyor ilk preg_replace, tüm satırsonlarını ve noktalı virgül kaldırır. Sonraki kısmı farklı 'belirteçleri' içine girdi dizesi böler; isimleri, parantez ve parantez inbetween şeyler. Ne yaptığını görmek için bir print_r $matches; yapın.

Sonra belirteçleri geçer ve bir ağaca ekler gerçekten hackish durum makinesi (ya da için-döngü okunur) sadece orada. Ayrıca iç içe ağaçları inşa edebilmek için bir yığın vardır.

Bu algoritma hiçbir şekilde test olduğunu unutmayın. "Gerçek hayat" girişi ile sunulduğunda muhtemelen kıracak. Örneğin, bir değeri içindeki bir parantez sorun neden olur. Ayrıca dizeleri tırnak kaldırmaz unutmayın. Ben başkasına tüm bırakacağım ...

İstediğiniz gibi ama, bu da bir başlangıç ​​:)

Şerefe!

PS. Burada kolaylık için yukarıdaki kod çıktısı, var:

Array
(
    [NAME] => Array
        (
            [title] => A_STRING   
            [settings] => Array
                (
                    [SetA] => 15, 15 
                    [SetB] => "test" 
                )

            [desc] => Array
                (
                    [Desc] => A_STRING       
                    [Cond] => A_STRING       
                )

        )

)

Bu gerçek bir dilbilgisi gibi görünüyor - bir ayrıştırıcı jeneratör kullanmak gerekir. This discussion başlamak gerekir.

Orada zaten php için yapılan birkaç seçenek vardır: a lexer generator module ve bu parser generator module olduğunu.

Bu bir cevap değil bir öneri değil:

Belki giriş kodu benzer bir sözdizimi vardır JSON ile uyumlu olacak şekilde değiştirebilirsiniz. JSON ayrıştırıcıları ve jeneratörler PHP için kullanılabilir.

http://www.json.org/

http://www.php.net/json