是否可以将语法设置为不区分大小写。
例如一个规则:
checkName = 'CHECK' Word;
将匹配check name
以及CHECK name
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
或其他的。
希望有帮助。