我在玩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
非常感谢您提前!
发布于 2019-11-22 09:37:51
可以对字符串中的每个值进行多种解释,这是因为在表达式和排名之前都有可选的空格:
如果查看第二个元素k,可以将其解释为:
由于您有2个可能的12项在您的字符串,您将得到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 %}https://stackoverflow.com/questions/56670020
复制相似问题