为什么我的Nearley语法引起循环?

时间:2019-06-19 14:24:36

标签: nearley

我正在玩nearley.js,这使我感到困惑。 作为测试,我试图建立一个解析扑克等级的解析器。

现在,这种语法正在按预期工作:

@{% function nuller() { return null; } %}

main -> _ composition _                         {% nuller %}

composition -> _ expression _                   {% nuller %}
    | composition _ "," _ rank                  {% nuller %}

expression -> _ rank _                          {% nuller %}
rank -> [a, k, q, j, t, A, K, Q, J, T, 2-9]     {% nuller %}

_ -> [\s]:*                                     {% nuller %}

但是,第二秒钟我将| composition _ "," _ rank更改为| composition _ "," _ expression,然后以循环结束:

@{% function nuller() { return null; } %}

main -> _ composition _                         {% nuller %}

composition -> _ expression _                   {% nuller %}
    | composition _ "," _ expression            {% nuller %}

expression -> _ rank _                          {% nuller %}
rank -> [a, k, q, j, t, A, K, Q, J, T, 2-9]     {% nuller %}

_ -> [\s]:*                                     {% nuller %}

有人可以解释一下为什么吗? 可以在操场上快速测试代码: https://omrelli.ug/nearley-playground/

我使用的测试字符串为:a, k, q, j, t, 9, 8, 7, 6, 5, 4, 3, 2

非常感谢您!

1 个答案:

答案 0 :(得分:0)

好吧,字符串中的每个值都有多种解释,这是因为在表达式和等级之前,您都具有可选的空格:

如果您查看第二个元素k,则可以解释为:

  • 空格+表达式
  • 空间+等级

由于您的字符串中有12种商品的2种可能性,因此您将获得144种可能的组合。

这将返回一个解决方案(我在expression之前省略了可选的空格):


main -> _ composition _                         {% nuller %}

composition -> _ expression _                   {% nuller %}
    | composition _ "," expression              {% nuller %}

expression -> _ rank _                          {% nuller %}
rank -> [a, k, q, j, t, A, K, Q, J, T, 2-9]     {% nuller %}

_ -> [\s]:*                                     {% nuller %}