在php中阅读类似lua的代码

在php中阅读类似lua的代码,php,parsing,Php,Parsing,我有个问题。。。 我有这样的代码,我想用PHP阅读 NAME { title ( A_STRING ); settings { SetA( 15, 15 ); SetB( "test" ); } desc { Desc ( A_STRING ); Cond (

我有个问题。。。 我有这样的代码,我想用PHP阅读

 NAME
 {
    title
    (
        A_STRING
    );

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

    desc
    {
        Desc
        (
            A_STRING
        );

        Cond
        (
            A_STRING
        );  

    }
 }
<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;
}

?>
我想:

$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";
我不知道该怎么开始:/。变量并不总是相同的。 有人能告诉我如何解析这样的文件吗


Thx

这看起来像一个真正的语法-您应该使用解析器生成器。你应该开始了


php:a已经有了一些选项,这是一个。

这不是答案,而是建议:

也许您可以修改您的输入代码以与具有类似语法的JSON兼容。JSON解析器和生成器可用于PHP


如果文件这么简单,那么使用自己的解析器可能会容易得多。无论如何,你最终还是会用lexers编写正则表达式。下面是一个快速的黑客示例:(in.txt应该包含上面提供的输入。)


因为语法看起来并不复杂,一个手工编写的递归下降解析器也就足够了。这可以避免使用语法分析器生成器。嗯——也许吧——但我认为每个“程序员”都应该至少用一次生成器弄脏自己的手。谢谢!这真的很有帮助。现在我有了一个可以编写代码的基础:)。
Array
(
    [NAME] => Array
        (
            [title] => A_STRING   
            [settings] => Array
                (
                    [SetA] => 15, 15 
                    [SetB] => "test" 
                )

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

        )

)