【发布时间】: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] 到 <a href ="func__ shoot_dragon()"> shoot </a>。但是如果我尝试使用更复杂的代码:
你可以 [LINK: shoot | shoot_dragon] 用你的箭射龙或 [LINK: draw | stab_dragon] 你的剑,但你必须让它靠近。
我的函数不明确,因此返回许多结果。 (由于 javascript 处理
nulls 的方式,它似乎很容易使用,但在最好的情况下,这仍然比需要的慢。)更普遍的问题是,我如何才能毫无歧义地返回无限期的两场比赛?
(作为奖励,谁能解释一下
:*、:+、:?的确切含义?我不明白问号。)
【问题讨论】:
-
:*、:+、:?等同于正则表达式中不带冒号的类似运算符:“零次或多次重复”、“一次或多次重复”、“零次或一次重复”(即“可选的”)。与正则表达式一样,它们是作用于前一个参数的后缀运算符。
标签: javascript parsing nearley