用于解析开始和结束标记的 Nearley 解析器语法

Nearley parser grammar for parsing opening and closing tags

假设我有一种简单的语言可以在 nearley 中解析,它只是由字符串组成。 "this is a string"

string -> "\"" chars "\""

但是,该字符串可以包含花括号内的代码。为了简单起见,我们只说 code 只能是另一个字符串。"this is a string with {"code"}"

code -> "{" string "}"

如何在 Nearley 中定义新字符串以包含 code 定义?我一直得到大量结果,因为 chars 可以匹配一个或多个字符。

string -> "\"" charCode "\""

charCode -> (chars | code) charCode
| (chars | code)

code -> "{" string "}"

chars -> char chars
| char
char -> [^{}]

理想情况下,我可以将这样的东西 "chars {"code"} chars chars {"code"} chars" 变成数组 ["chars ", "code", " chars chars ", "code", " chars"]

也许只能按照此答案中的建议使用正则表达式和 moo 来执行此操作? (在这个例子中,开始和结束标签不那么模糊,我没有遇到同样的问题。)

当然,我会使用基于正则表达式的词法分析器。但是你可以尝试编写一个明确的语法,基于你永远不可能在 charCode:

中有两个相邻的 chars 的观察
string -> "\"" charCodeStart chars:? "\""
charCodeStart -> 
               | charCodeStart chars:? code

另一种可能性,使用 EBNF:

string -> "\"" ( char:* code ):* char:* "\""

您可能需要稍微尝试一下才能正确使用它。我不怎么用nearley。