是否可以将语法设置为不区分大小写.
所以例如一条规则:
checkName = 'CHECK' Word;
Run Code Online (Sandbox Code Playgroud)
将匹配check name以及CHECK name
这里是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或其他什么.
希望有所帮助.
| 归档时间: |
|
| 查看次数: |
131 次 |
| 最近记录: |