用于解析开始和结束标记的 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。
假设我有一种简单的语言可以在 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。