Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 通过CFG/树搜索/预测下一个终端/非终端?_Parsing_Search_Code Generation_Prediction_Context Free Grammar - Fatal编程技术网

Parsing 通过CFG/树搜索/预测下一个终端/非终端?

Parsing 通过CFG/树搜索/预测下一个终端/非终端?,parsing,search,code-generation,prediction,context-free-grammar,Parsing,Search,Code Generation,Prediction,Context Free Grammar,我正在寻找一种算法来帮助我预测给定字符串/前缀和上下文无关语法的下一个标记 第一个问题是代表CFG的确切结构是什么。它似乎是一棵树,但它是什么类型的树呢?我在问,因为树叶总是有秩序的,有秩序的树吗? 如果我知道正确的结构,我可能会找到自下而上搜索的算法 如果这不完全是一个搜索问题,那么下一个最接近的问题是解析前缀字符串,然后生成下一个标记?我该怎么做 有什么想法吗 我当前生成的语法很简单,它没有规则(除非我决定将语法重新用于新序列,否则我会)。它是由Sequitur algo生成的,被称为SL

我正在寻找一种算法来帮助我预测给定字符串/前缀和上下文无关语法的下一个标记

第一个问题是代表CFG的确切结构是什么。它似乎是一棵树,但它是什么类型的树呢?我在问,因为树叶总是有秩序的,有秩序的树吗? 如果我知道正确的结构,我可能会找到自下而上搜索的算法

如果这不完全是一个搜索问题,那么下一个最接近的问题是解析前缀字符串,然后生成下一个标记?我该怎么做

有什么想法吗


我当前生成的语法很简单,它没有规则(除非我决定将语法重新用于新序列,否则我会)。它是由Sequitur algo生成的,被称为SLG(单行语法)。。但是,如果我使用多个seq生成它,最重要的规则将是Ex:>

S : S1 z S3 | u S2 .. S5 S1 | S4 S2 .. |... | Sn 
S1 : a b
S2 : h u y
...
…即。顶部重型SLG,除顶部规则外,所有其他规则均不具备或|



作为旁注,我正在考虑将其转换为Prolog和/或DCG程序的方法,哪里有更简单的方法可以轻松地完成我想要的任务?!你觉得怎么样;简言之,这是一个难题。但对于给定的语法,它可能非常简单。一切都取决于语法的性质


基本算法实际上是从对前缀使用一些解析算法开始的。然后,通过尝试使用每个可能的标记继续解析,只保留那些不会立即产生错误的标记,就可以做出粗略的预测

这肯定会给你一个列表,其中包括所有可能的延续。但该列表也可能包含无法在正确输入中显示的标记。事实上,正确的列表可能是空的(因为给定的前缀不是任何正确输入的前缀);如果解析算法无法正确验证令牌序列是否是可能的前缀,则会发生这种情况

这在一定程度上取决于语法本身。例如,如果语法是LR(1),那么LR(1)解析算法可以精确地识别延续集。如果某些k>1的语法是LR(k),那么理论上可以为同一种语言生成LR(1)语法,但生成的语法可能会非常大。否则,您可能不得不接受“误报”。如果您的目标是提供制表符完成,那么这可能是可以接受的,但在其他情况下,它可能没有那么大的用处

用于执行内部解析和探索备选方案的精确数据结构将取决于所使用的解析算法。许多解析算法,包括内部数据结构为简单堆栈的标准LR解析算法,都具有可变的内部状态,这并不真正适合于探索步骤;您可以通过在继续使用每个试用令牌之前复制整个内部数据结构(即堆栈)来调整这种算法。或者,您可以实现写时复制堆栈。但是解析器堆栈通常不是很大,所以每次复制它通常是可行的。(Bison就是这样用“预期令牌”列表生成扩展的错误消息的,实际上它似乎不会触发不可接受的运行时开销。)

或者,您可以使用CYK图表解析的一些变体(或者像Earley算法这样的GLR算法),其内部数据结构可以以不涉及破坏性修改的方式实现。此类算法通常用于非LR(1)的语法,因为它们可以处理任何CFG,尽管高度不明确的语法可能需要很长时间才能解析(与输入长度的立方体成比例)。不过,如上所述,您将从这些算法中得到误报


如果误报是不可接受的,那么您可以使用某种启发式搜索来尝试查找完成试用前缀的输入序列。理论上这可能需要相当长的时间,但对于许多语法来说,广度优先搜索可以在合理的时间内找到一个完成点,因此您可以在给定的最长时间后终止搜索。这不会产生误报,但时间限制可能会阻止它找到完整的可能连续性集。

您需要多准确的预测?你是只想要一个可能的下一个令牌,还是想要一整套令牌?我也不确定你所说的“代表CFG的确切结构是什么”。CFG是一组无序的产品,每个产品都将一个非终端映射到一个有序且可能为空的语法符号序列上。那不是很像树。例如,带有有序子级的树状结构显示为解析的表示形式。。。2-3是的。。产品是无序的,但每个产品的主体(如果不是|)都是有序的。。我忘记了这个案子。。。。。因为在我的例子中,到目前为止,它们始终是唯一的,除了顶级产品..对不起,我目前生成的语法很简单,它没有或规则(除非我决定将语法重新用于新序列)。它是由Sequitur algo生成的,被称为SLG(单行语法)。。但是,如果我使用许多seq生成它,最重要的规则将是>s:S1 | S2 | S3 |……|Sn..即。头重脚轻SLG@sten:如果您的语言是有限的,则解决方案要简单得多。但我的总结陈述已经涵盖了这一点:一切都取决于语法的特殊性质。如果你能写一个更具体的问题,你就能得到更具体的答案。(但请提出新问题,而不是编辑此问题。)刚刚测试过;)将CFG转换为DCG,然后Prolog执行rest,即解析和预测。。。现在只需考虑如何使用差异列表而不是DCG实现/转换CFG到纯Prolog,因为基于python的Prolog不支持