是否可以将语法设置为不区分大小写。
所以例如规则:
checkName = 'CHECK' Word;
将匹配check name
以及CHECK name
答案 0 :(得分:5)
PEGKit的创作者。
目前唯一的方法是以一种圆形的方式使用语义谓词:
checkName = { MATCHES_IGNORE_CASE(LS(1), @"check") }? Word Word;
一些解释:
语义谓词是直接从ANTLR中提取的一个功能。语义谓词部分是{ ... }?
。这些可以放在语法规则的任何位置。它们应该包含单个表达式或以return
语句结尾的一系列语句,这些语句的计算结果为布尔值。这个包含一个表达式。如果表达式的计算结果为 false ,则当前规则(在这种情况下为checkName
)的匹配将失败。 true 值将允许匹配继续。
MATCHES_IGNORE_CASE(str, regexPattern)
是我为在谓词和动作中使用正则表达式匹配而定义的便捷宏。它有一个区分大小写的朋友:MATCHES(str, regexPattern)
。第二个参数是NSString*
正则表达式模式。意思应该是显而易见的。
LS(num)
是您在Predicates / Actions中使用的另一个便利宏。这意味着获取 Lookahead String ,并且参数指定了前瞻的距离。因此LS(1)
意味着1
前瞻。换句话说,"获取解析器即将尝试匹配的第一个即将到来的令牌的字符串值。
请注意,我在那里仍然匹配Word
两次。第一个Word
是匹配'检查' (尽管它在谓词中已经测试,但不匹配并消耗)。第二个Word
适用于您的name
或其他任何内容。
希望有所帮助。