我正在编写一些使用PegKit的代码,但我遇到了一些我不确定如何解决的问题。我有一个看起来像这样的语法(简化):
expr = runtimeExpr | objectExpr;
runtimeExpr = is? runtimeObject;
objectExpr = runtimeObject keyPath;
runtimeObject = '[' string ']';
is = 'is';
keyPath = string;
我正在寻找以下结果:
[abc] -> runtime expr.
is [abc] -> runtime expr.
[abc].def -> object expr.
然而,正在发生的是生成的解析器代码如下所示:
if ([self predicts:STLOGEXPRESSIONPARSER_TOKEN_KIND_IS, 0]) {
[self runtimeExpr_];
} else if ([self predicts:STLOGEXPRESSIONPARSER_TOKEN_KIND_OPEN_BRACKET, 0]) {
[self objectExpr_];
}
有效的说,为了解析运行时表达式,它必须以'is'开头。这意味着它[abc]
被作为对象 expr 传递。
所以我需要帮助的是理解如何在语法语法中表达这个逻辑:
如果字符串以“is”开头,后跟 runtimeObject,或者只是一个 runtimeObject,则将其作为 runtimeExpr 处理。
否则将其作为 objectExpr 处理。