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
)
)
)