我在编写 ohm 语法时遇到困难。
这是:
MyGrammar {
Whole = section*
section = partA? partB?
partA = "foo" | "bar"
partB = "baz"
}
它给我的是一个错误:
Nullable expression section is not allowed inside '*' (possible infinite loop)
这是可以理解的,但问题是我想做的是说一个部分中总是有
partA
或 partB
或两者都有。
MyGrammar {
Whole = something+
something = partA | partB
partA = "foo" | "bar"
partB = "baz"
}
因此,正如错误消息所暗示的那样,您不能为可为空的表达式添加 kleene-star 。 'nullable' 表示'将接受空字符串';原因相当直观 - 如果您的语法接受空字符串的无限重复,那么解析它不会终止。我提供了一个可行的示例,但我不确定它是否相当于您想要的语法 - 如果您在问题中提供更多详细信息,那么我会尝试更具体。
此处的错误是
section = partA? partB?
– 允许您想要的内容:partA、partB、partA AND partB;但它也不允许(这就是问题)partA 和partB。换句话说,什么都没有,即“可为空”
您可以像这样更明确地写出它以禁止 null 情况:
MyGrammar {
Whole = section*
section = partA partB | partA | partB
partA = "foo" | "bar"
partB = "baz"
}