我正在玩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
非常感谢您!
答案 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 %}