0

假设我有一种简单的语言来解析,它只是由字符串组成。"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 来做到这一点?(在这个例子中,开始和结束标签不那么模棱两可了,我没有遇到同样的问题。)[Nearley]:如何解析匹配的开始和结束标签

4

1 回答 1

1

当然,我会使用基于正则表达式的词法分析器。但是你可以尝试写一个明确的语法,基于你永远不能在 a 中有两个相邻的chars观察charCode

string -> "\"" charCodeStart chars:? "\""
charCodeStart -> 
               | charCodeStart chars:? code

另一种可能性,使用 EBNF:

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

你可能不得不玩一点才能让它正确。我不怎么用nearley。

于 2021-04-21T06:52:38.293 回答