Objective c 如何使用ParseKit'指定字符范围[a-zA-Z];语法分析 问题:

Objective c 如何使用ParseKit'指定字符范围[a-zA-Z];语法分析 问题:,objective-c,regex,grammar,parser-generator,parsekit,Objective C,Regex,Grammar,Parser Generator,Parsekit,无法使用语法定义字符范围。 (字母范围从A到Z,带或不带大写) 上下文: 我正在使用ParserGenApp生成解析器。 解析器用于.Framework,其功能类似于自定义语言解析器。 解析器将模拟使用for Java生成的工作解析器 示例: Antlr4:CHAR:[a-zA-Z] 正则表达式:“[a-zA-Z]”,它将检测从“a”到“Z”的任何字母,包括大写字母 备用正则表达式:“[c-xB-Y]” 问题: 如何使用ParserGenApp从语法上定义字符范围? 对于字符/字母,是否有类似

无法使用语法定义字符范围。
(字母范围从A到Z,带或不带大写)


上下文: 我正在使用ParserGenApp生成解析器。
解析器用于.Framework,其功能类似于自定义语言解析器。
解析器将模拟使用for Java生成的工作解析器


示例: Antlr4:
CHAR:[a-zA-Z]

正则表达式:
“[a-zA-Z]”
,它将检测从“a”到“Z”的任何字母,包括大写字母 备用正则表达式:
“[c-xB-Y]”


问题: 如何使用ParserGenApp从语法上定义字符范围?
对于字符/字母,是否有类似“Word”或“Number”的语法指令?
是否有其他方法来声明范围?

此处的创建者

背景: ParseKit目前正在进行重新设计。有两种使用ParseKit的方法:和

旧方法(动态):以前,ParseKit在运行时生成动态的、非确定性的解析器(此代码在库中仍然可用)。生成这些解析器的速度很慢,生成的解析器也很慢(尽管它们有一些有趣的特性,在非常罕见的情况下非常有用)

新方法(静态):现在,使用ParserGenApp(如您在这里所述),ParseKit为确定性的()记忆解析器生成静态ObjC源代码。源代码在设计时生成,然后可以编译到项目中。生成的解析器速度很快。这个新选项现在是使用ParseKit的首选方法。旧方法不知何故会被弃用

我假设您正在使用新的静态方法(听起来您已经从您的问题中获得了答案)

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

  • 使用内置的
    Word
    规则参考,它相当于
    [\u a-zA-Z][-'\u a-zA-Z0-9]*
    ,通常会执行您想要的操作: username = Word; 或者: 用户名={MATCHES_IGNORE_CASE(@“[a-z]”,LS(1))}?字 笔记:
  • 语法谓词语法是
    {…}?
    放在规则引用之前(
    Word
  • 您可以在语法谓词中使用任何ObjC代码,但它必须返回布尔值
    MATCHES()
    MATCHES\u IGNORE\u CASE()
    ,和
    LS()
    都是我为了方便而提供的C宏
  • 如果谓词中的ObjC代码比单个表达式长,则必须使用分号来终止语句。记住返回一个布尔值
  • MATCHES()
    MATCHES\u IGNORE\u CASE()
    宏是使用
    NSRegularExpression
    的快捷方式
  • LS()
    宏代表LookaheadString
    LS(1)
    表示获取第一个前瞻令牌的
    NSString
    值。在这种情况下,第一个先行标记将是由
    Word
    匹配的标记。要查看两个或三个令牌,可以使用
    LS(2)
    LS(3)
    等等
  • 在与新的静态ParseKit(也称为ParserGenApp)一起使用的语法中,旧的正则表达式文字语法还不如旧的动态ParseKit中的语法。最后我想补充一点

  • 很好的解释!这对我帮助很大,谢谢! username = { MATCHES(@"[c-xB-Y]", LS(1)) }? Word; username = { MATCHES_IGNORE_CASE(@"[a-z]", LS(1)) }? Word;