不区分大小写的令牌匹配

uta*_*hak 3 pegkit

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

所以例如一条规则:

checkName = 'CHECK' Word;
Run Code Online (Sandbox Code Playgroud)

将匹配check name以及CHECK name

Tod*_*orf 5

这里是PEGKit的创造者.

目前执行此操作的唯一方法是以循环方式使用语义谓词:

checkName = { MATCHES_IGNORE_CASE(LS(1), @"check") }? Word Word;
Run Code Online (Sandbox Code Playgroud)

一些解释:

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

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

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

  • 请注意,我在那里仍然匹配Word 两次.第一个Word是匹配'check'所必需的(尽管它已经在谓词中测试过,但它没有匹配和消耗).第二个Word是你的name或其他什么.

希望有所帮助.