2014-04-18 62 views

回答

5

造物主在这里。

到目前做到这一点的唯一方法是在一个迂回的排序的方式使用语义谓词

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

几点说明:

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

  • MATCHES_IGNORE_CASE(str, regexPattern)是一个方便的宏,我已经定义了您在谓词和动作中使用正则表达式匹配。它有一个区分大小写的朋友:MATCHES(str, regexPattern)。第二个参数是NSString*正则表达式模式。意义应该是明显的。

  • LS(num)是您在Predicates/Actions中使用的另一个便利宏。这意味着获取一个Lookahead字符串并且该参数指定要向前看多远。所以LS(1)的意思是前瞻1。换句话说,“获取解析器即将尝试匹配的第一个即将到来的令牌的字符串值”。

  • 请注意,我仍然匹配Word两次在那里。第一个Word是匹配'检查'所必需的(尽管它已经在测试在谓词中,它是不匹配和消耗)。第二个Word是为你的name或其他。

希望有所帮助。

+0

只是为了看看我是否理解正确我使用空白Word测试作为谓词是什么决定有效性。所以我很安全地假设它是否符合谓词已经通过的规则,并且第一个单词与谓词regex匹配。 – utahwithak

+0

基本上,是的。从技术上讲,只有'Word' ref实际上**匹配**'检查'字输入。但是如果谓词比较复杂,那么'Word' ref匹配永远不会失败。所以实际上,Predicate正在完成**的实际工作。但是'Word' ref需要执行**匹配并消耗令牌**。 –

相关问题