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()
宏代表LookaheadStringLS(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;