在解析器/解释器中添加故意歧义

时间:2019-04-01 18:36:29

标签: python algorithm parsing abstract-syntax-tree interpreter

我编写了一个解析器,该解析器可以正确地使用表达式并从中创建AST。然后,我的解释器将对该AST进行评估,然后返回解决方案。但是,我希望解析器(或解释器)考虑到表达式中的歧义(缺少括号)。

例如,如果我编写类似R∩G-B的表达式,我希望看到返回(R∩G)-B和R∩(G-B)的AST。我已经看到许多解决方案,可以在解析表达式时消除歧义,但是我希望能够看到表达式的所有可能解释。

这是我的解析器类的摘录:

<div class="dirButtons">
    <input type="button" id="right" class="button" name="direction" value="to right" onclick="direction(this)">
    <input type="button" id="left" class="button" name="direction" value="to left" onclick="direction(this)">
    <input type="button" id="bottom" class="button" name="direction" value="to bottom" onclick="direction(this)">
    <input type="button" id="top" class="button"name="direction" value="to top" onclick="direction(this)">
</div>

在我当前的设置下,解析器将仅针对R∩(G-B)返回AST。

2 个答案:

答案 0 :(得分:1)

对于语法不明确的情况,有一些解析算法可以找到解析给定字符串的所有可能方法:Earley,CYK,Tomita,GLR,GLL。但是它们都离您现在拥有的递归下降解析器还很远。 (GLL声称它类似于递归下降,但这似乎有点困难。)

答案 1 :(得分:0)

做到这一点的“明显”方法是向解析器接受的语言添加其他语法规则。我的意思是,首先写下您的递归解析器接受的语法;目前,它仅接受表达式的解释。为其他解释添加明确的规则;这定义了歧义。

类似的东西:

set_expression = intersection | set_expression '-' intersection;
intersection = term  |  intersection '∩'  intersection_term ;
term = primitive_set | term '∩' primitive_set ;

现在“只是”调整您的解析器以接受这些规则。为此,您的解析器可能必须在遇到替代项时实现解析状态的保存,以便它可以还原(“回溯”)并尝试替代项。这包括输入流的替代点。您可以通过缓冲输入文本和/或输入令牌来实现此目的。

迈克尔·戴克(Michael Dyck)列出了各种解析引擎/方法,这些解析器/方法以更常规的方式执行此操作,但它们都始于您的语法明确包含歧义替代词的假设。