【问题标题】:Nearley parser - how to return indefinite string of matches without ambiguity? (Only four lines)Nearley 解析器 - 如何返回不明确的匹配字符串? (只有四行)
【发布时间】:2022-12-12 10:11:35
【问题描述】:

我正在编写旨在让您轻松发布自己选择的冒险故事的软件。但是,我想将我的解析器从我自己编写的 JavaScript 更改为 Nearley 系统。

我有一个四行 nearley 解析器:

main->(excludebrackets link:+ excludebrackets):+
link->"[LINK:"i excludebrackets "|" excludebrackets "]"
{% (d) => {return'<a href ="func__' + d[3][0].join("") + '()">'+d[1][0].join("")+"</a>"}%} 
excludebrackets->[^\\[\]]:+ | null

唯一的问题是最顶层。 “链接”非终结符可以很好地转换以下内容:

[LINK: shoot | shoot_dragon]&lt;a href ="func__ shoot_dragon()"&gt; shoot &lt;/a&gt;。但是如果我尝试使用更复杂的代码:

你可以 [LINK: shoot | shoot_dragon] 用你的箭射龙或 [LINK: draw | stab_dragon] 你的剑,但你必须让它靠近。

我的函数不明确,因此返回许多结果。 (由于 javascript 处理 nulls 的方式,它似乎很容易使用,但在最好的情况下,这仍然比需要的慢。)

更普遍的问题是,我如何才能毫无歧义地返回无限期的两场比赛?

(作为奖励,谁能解释一下 :*:+:? 的确切含义?我不明白问号。)

【问题讨论】:

  • :*:+:?等同于正则表达式中不带冒号的类似运算符:“零次或多次重复”、​​“一次或多次重复”、​​“零次或一次重复”(即“可选的”)。与正则表达式一样,它们是作用于前一个参数的后缀运算符。

标签: javascript parsing nearley


【解决方案1】:

如果通过“我怎样才能返回两个匹配项的无限系列,没有歧义?”,你的意思是“a* a* 的明确等价物是什么?”,答案是因为 a* a*一定模棱两可,唯一的解决办法是删除其中之一(匹配相同的语法)。

由于 excludebrackets 已经是任意重复,您可以使用更简单的

main->(excludebrackets link):* excludebrackets

您可以通过使用 :* 而不是 :+ 来编写没有显式 | nullexcludebrackets。根据定义,对于任何 XX+ | nullX* 相同。

【讨论】:

  • 一千谢谢你分享你的才华。
  • 比如说,如果这最终出现在 github 上,你想要某种提及吗?我让你加入了 cmets。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-23
  • 2021-12-06
  • 2018-12-11
  • 2011-10-02
  • 1970-01-01
  • 2012-10-12
相关资源
最近更新 更多