我想知道正式语言。我有一种解析器:它读取类似XML的序列化树结构,并将其变成一个多中性阵列。

我的观点在于所使用的算法和不同类型的自动机(State Machines Turing Machines堆栈...)之间的相似之处。

因此,问题是:我在这里暗示使用哪种自动机,以及适合哪种形式语言?递归呢?

我的意思是“我隐式使用的自动机”是“这是完成相同工作的最小自动机”。

这是完整的来源:

$单词; // XML标签的数组'u003Ctag> ','u003C/tag> '和简单的文本内容

$ tree = array('type'=>'root','sub'=> array());

$ ptree = array(&$ tree);

$ deep = 0;

foreach($单词为$ elem){

if ( preg_match($openTag, $elem) ) { // $elem is an open tag

    $pTree[$deep++]['sub'][] = array( // we add an element to the multidim array
        'type' => 'block',
        'content' => $elem,
        'sub' => array()
    );

    $size = sizeof($pTree[$deep - 1]['sub']);
    $pTree[$deep] = &$pTree[$deep - 1]['sub'][$size - 1]; // down one level in the tree

} elseif ( preg_match($closeTag, $elem) ) { // it is a close tag

    $deep--; // up in the tree 

} else { // simple element

    $pTree[$deep]['sub'][] = array(
        'type' => 'simple',
        'content' => $elem
    );

}

}

有帮助吗?

解决方案

请再次查看您的问题。您指的是 $words 变量,这不是您的示例。另外,没有代码,不知道正在做什么,很难回答您。

从变量的名称来看 $deep, ,可能不是国家。自动机中的状态是特定于自动机的集合的元素; $deep 看起来它可以包含一个深度,任何积极的整数。同样,没有代码很难说出。

无论如何,如果您没有将代码设计为实现,则可能根本不会“隐式使用”任何自动机。

您的简单类似XML的文件可能可以通过确定性的堆栈计算机识别,也可以通过确定性的无上下文语法生成,使其在Chomsky层次结构中成为2型。再一次,这只是一个猜测,“ XML样的序列化树结构”对于任何形式主义而言都太模糊了。

简而言之,如果您想使用任何形式的理论,请更正式地做您的问题。


编辑(查看代码后):

您正在建一棵树。对于自动机来说,这是遥不可及的(至少是“标准”)。有限的自动机仅适用于输入和状态,堆栈机添加了堆栈,图灵机具有可以在两个方向上移动的读写胶带。

自动机的“输出”是一个简单的“是”(接受)或“否”(不接受,或无限循环)。 (可以将图灵机定义为在其磁带上提供更多的输出。)我可以回答的最好的“最小自动机可以完成相同的工作”,这是您的语言可以被堆栈计算机接受;但是它的工作方式会大不相同,不会给您树木。

但是,您可能会调查 语法 - 另一个介绍概念的正式语言结构 解析树。您在这里做的是用自上而下的解析器创建这样的解析树。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top