是否可以将语法设置为不区分大小写匹配。
例如一条规则:
checkName = 'CHECK' Word;
会匹配check name
也CHECK name
的创造者PEGKit https://github.com/itod/pegkit here.
当前执行此操作的唯一方法是使用语义谓词以一种迂回的方式:
checkName = { MATCHES_IGNORE_CASE(LS(1), @"check") }? Word Word;
一些解释:
语义谓词是直接从 ANTLR 提升的功能。语义谓词部分是{ ... }?
。这些可以放置在语法规则中的任何位置。它们应该包含单个表达式或一系列以return
计算结果为布尔值的语句。该表达式包含一个表达式。如果表达式的计算结果为false,当前规则的匹配(checkName
在这种情况下)将fail. A true值将允许匹配继续进行。
MATCHES_IGNORE_CASE(str, regexPattern)
是我定义的一个方便的宏,供您在谓词和操作中使用以进行正则表达式匹配。它有一个区分大小写的朋友:MATCHES(str, regexPattern)
。第二个参数是NSString*
正则表达式模式。意思应该是显而易见的。
LS(num)
是另一个方便您在谓词/操作中使用的宏。这意味着获取一个前瞻字符串参数指定向前看多远。所以LS(1)
意味着向前看1
。换句话说,“获取解析器将要尝试匹配的第一个即将到来的标记的字符串值”。
请注意,我仍然匹配Word
twice在最后那里。首先Word
对于匹配“检查”是必要的(即使它已经是tested在谓词中,它是未匹配和消耗)。第二Word
是为了你的name
管他呢。
希望有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)