不区分大小写的令牌匹配

时间:2014-04-18 19:47:08

标签: pegkit

是否可以将语法设置为不区分大小写。

所以例如规则:

checkName = 'CHECK' Word;

将匹配check name以及CHECK name

1 个答案:

答案 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或其他任何内容。

希望有所帮助。