ParseKit的创建者在这里。
语境:
ParseKit 目前正在进行一些重新设计。ParseKit 有两种使用方式:旧方式和新方式。
OLD WAY(动态):以前,ParseKit 在运行时生成 动态的、非确定性的解析器(此代码在库中仍然可用)。生成这些解析器很慢,生成的解析器也很慢(尽管它们有一些有趣的属性,在极少数情况下很有用)。
新方法(静态):现在,使用ParserGenApp(如您在此处描述的),ParseKit为确定性( PEG ) 记忆解析器生成静态ObjC 源代码。源代码是在设计时生成的,然后您可以将其编译到您的项目中。生成的解析器很快。这个新选项现在是使用 ParseKit 的首选方法。旧方法将以某种方式被弃用。
我会假设你正在使用新的静态方法(听起来你已经从你的问题中)。
回答:
以下是在 ParseKit 语法中匹配“单词”的两种方法:
Word
使用等效于的内置规则引用[_a-zA-Z][-'_a-zA-Z0-9]*
,并且通常会执行您想要的操作:用户名 = 字;
- 如果内置
Word
终端与您想要的不完全匹配,请在其前面加上一个在宏中包含正则表达式的语法谓词(从 ANTLR3 窃取的想法/语法)MATCHES()
:用户名 = { MATCHES(@"[c-xB-Y]", LS(1)) }? 单词;
或者:
用户名 = { MATCHES_IGNORE_CASE(@"[az]", LS(1)) }? 单词;
笔记:
- Syntactic Predicate语法
{ ... }?
放置在规则引用之前(在Word
这种情况下)。
- 您可以在语法谓词中使用任何 ObjC 代码,但它必须返回一个布尔值。
MATCHES()
, MATCHES_IGNORE_CASE()
, 和LS()
只是我为了方便而提供的 C 宏。
- 如果 Predicate 中的 ObjC 代码比单个表达式长,您必须像往常一样使用分号来终止语句。请记住返回一个布尔值。
- 和
MATCHES()
宏MATCHES_IGNORE_CASE()
是使用NSRegularExpression
.
- 该
LS()
宏代表 Lookahead S字符串 。LS(1)
表示获取NSString
第一个前瞻令牌的值。在这种情况下,第一个前瞻标记将是匹配的标记Word
。要向前看两个或三个标记,您可以使用LS(2)
,LS(3)
依此类推。
- 与旧的动态 ParseKit 一起使用的新静态 ParseKit(又名 ParserGenApp)的语法中(还)不提供方便的旧 Regex 文字语法。我想最后补充一下。