假设我有一种简单的语言可以在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"]
也许只能使用此答案中建议的regex和moo来完成此操作?(在本例中,开始标记和结束标记比较明确,我没有遇到同样的问题。) [Nearley]: how to parse matching opening and closing tag
发布于 2021-04-21 14:52:38
当然,我会使用基于regex的lexer。但是您可以尝试编写一种明确的语法,基于这样的观察:在一个chars中永远不能有两个相邻的charCode
string -> "\"" charCodeStart chars:? "\""
charCodeStart ->
| charCodeStart chars:? code另一种可能性是使用EBNF:
string -> "\"" ( char:* code ):* char:* "\""您可能需要尝试一下才能正确地使用它。我不怎么用nearley。
https://stackoverflow.com/questions/67189678
复制相似问题