2

问题:

无法使用ParseKit 的语法定义字符范围。
(从 A 到 Z 的字母,有或没有大写)。


语境:

我正在使用ParseKit 的ParserGenApp 生成解析器。
解析器用于 .Framework 并用作自定义语言解析器。Parser 将模仿使用Antlr4 for Java
生成的工作 Parser 。


例子:

Antlr4: CHAR : [a-zA-Z];
正则表达式: "[a-zA-Z]" 它将检测从“a”到“z”的任何字母,包括大写 替代正则表达式: "[c-xB-Y]"


问题:

如何使用 ParserGenApp 以语法方式定义字符范围? ParseKit
中是否有语法指令,例如字符/字母的“单词”或“数字”?
是否有另一种声明范围的方法?

4

1 回答 1

2

ParseKit的创建者在这里。

语境:

ParseKit 目前正在进行一些重新设计。ParseKit 有两种使用方式:旧方式新方式

OLD WAY(动态):以前,ParseKit 在运行时生成 动态的、非确定性的解析器(此代码在库中仍然可用)。生成这些解析器很慢,生成的解析器也很慢(尽管它们有一些有趣的属性,在极少数情况下很有用)。

新方法(静态):现在,使用ParserGenApp(如您在此处描述的),ParseKit为确定性( PEG ) 记忆解析器生成静态ObjC 源代码。源代码是在设计时生成的,然后您可以将其编译到您的项目中。生成的解析器很快。这个新选项现在是使用 ParseKit 的首选方法。旧方法将以某种方式被弃用。

我会假设你正在使用新的静态方法(听起来你已经从你的问题中)。

回答:

以下是在 ParseKit 语法中匹配“单词”的两种方法:

  1. Word使用等效于的内置规则引用[_a-zA-Z][-'_a-zA-Z0-9]*,并且通常会执行您想要的操作:

    用户名 = 字;
  2. 如果内置Word终端与您想要的不完全匹配,请在其前面加上一个在宏中包含正则表达式的语法谓词(从 ANTLR3 窃取的想法/语法)MATCHES()

    用户名 = { MATCHES(@"[c-xB-Y]", LS(1)) }? 单词;

    或者:

    用户名 = { MATCHES_IGNORE_CASE(@"[az]", LS(1)) }? 单词;

笔记:

  1. Syntactic Predicate语法{ ... }?放置在规则引用之前(在Word这种情况下)。
  2. 您可以在语法谓词中使用任何 ObjC 代码,但它必须返回一个布尔值。MATCHES(), MATCHES_IGNORE_CASE(), 和LS()只是我为了方便而提供的 C 宏。
  3. 如果 Predicate 中的 ObjC 代码比单个表达式长,您必须像往常一样使用分号来终止语句。请记住返回一个布尔值。
  4. MATCHES()MATCHES_IGNORE_CASE()是使用NSRegularExpression.
  5. LS()宏代表 Lookahead S字符串 。LS(1)表示获取NSString第一个前瞻令牌的值。在这种情况下,第一个前瞻标记将是匹配的标记Word。要向前看两个三个标记,您可以使用LS(2)LS(3)依此类推。
  6. 与旧的动态 ParseKit 一起使用的新静态 ParseKit(又名 ParserGenApp)的语法中(还)不提供方便的旧 Regex 文字语法。我想最后补充一下。
于 2014-02-25T15:08:23.197 回答