Ohm.js:“*”内不允许为空表达式部分

问题描述 投票:0回答:2

我在编写 ohm 语法时遇到困难。

这是:

MyGrammar {
  Whole = section*
  section = partA? partB?
  partA = "foo" | "bar"
  partB = "baz"
}

它给我的是一个错误:

Nullable expression section is not allowed inside '*' (possible infinite loop)

这是可以理解的,但问题是我想做的是说一个部分中总是有

partA
partB
或两者都有。

javascript ohm-js
2个回答
0
投票
MyGrammar {
  Whole = something+
  something = partA | partB
  partA = "foo" | "bar"
  partB = "baz"
}

因此,正如错误消息所暗示的那样,您不能为可为空的表达式添加 kleene-star 。 'nullable' 表示'将接受空字符串';原因相当直观 - 如果您的语法接受空字符串的无限重复,那么解析它不会终止。我提供了一个可行的示例,但我不确定它是否相当于您想要的语法 - 如果您在问题中提供更多详细信息,那么我会尝试更具体。


0
投票

此处的错误是

section = partA? partB?
– 允许您想要的内容:partA、partB、partA AND partB;但它也不允许(这就是问题)partA 和partB。换句话说,什么都没有,即“可为空”

您可以像这样更明确地写出它以禁止 null 情况:

MyGrammar {
  Whole = section*
  section = partA partB | partA | partB
  partA = "foo" | "bar"
  partB = "baz"
}
© www.soinside.com 2019 - 2024. All rights reserved.