3

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

例如一个规则:

checkName = 'CHECK' Word;

将匹配check name以及CHECK name

4

1 回答 1

5

PEGKit的创建者在这里。

目前这样做的唯一方法是以一种迂回的方式使用语义谓词:

checkName = { MATCHES_IGNORE_CASE(LS(1), @"check") }? Word Word;

一些解释:

  • 语义谓词是直接从 ANTLR 提升的功能。语义谓词部分是{ ... }?. 这些可以放在语法规则中的任何位置。它们应该包含单个表达式或一系列以return计算为布尔值的语句结尾的语句。这个包含一个表达式。如果表达式的计算结果为false,则当前规则(checkName在这种情况下)的匹配将失败值将允许匹配继续进行。

  • MATCHES_IGNORE_CASE(str, regexPattern)是我为您在 Predicates 和 Actions 中用于进行正则表达式匹配而定义的便利宏。它有一个区分大小写的朋友:MATCHES(str, regexPattern). 第二个参数是一个NSString*正则表达式模式。意义应该很明显。

  • LS(num)是您在谓词/动作中使用的另一个便利宏。这意味着获取一个前瞻字符串,参数指定前瞻的距离。所以LS(1)意味着提前1。换句话说,“获取解析器将要尝试匹配的第一个即将到来的令牌的字符串值”。

  • 请注意,最后我仍然匹配Word 两次。第一个Word是匹配“检查”所必需的(即使它已经在谓词中测试过,但它没有被匹配和消费)。第二个Word是给你的name或其他的。

希望有帮助。

于 2014-04-19T03:53:51.753 回答