Regex 不区分大小写的关键字匹配
我正在写一个语法来解析一种计算机语言,它可以与。这是一个Perl包,它简化了常规语言解析器的编写。它类似于yacc和其他LALR解析器生成器,但有一些有用的扩展,比如用正则表达式定义标记 我想要解析的语言使用关键字来表示部分和描述控制流。它还支持用作数据占位符的标识符。标识符不能与关键字具有相同的名称 现在,棘手的部分来了:我需要将关键字与标识符分开,但它们可能看起来很相似,所以我需要一个正则表达式模式,该模式不敏感地匹配标识符的大小写,其他什么都不需要 我提出的解决方案如下:Regex 不区分大小写的关键字匹配,regex,perl,yacc,Regex,Perl,Yacc,我正在写一个语法来解析一种计算机语言,它可以与。这是一个Perl包,它简化了常规语言解析器的编写。它类似于yacc和其他LALR解析器生成器,但有一些有用的扩展,比如用正则表达式定义标记 我想要解析的语言使用关键字来表示部分和描述控制流。它还支持用作数据占位符的标识符。标识符不能与关键字具有相同的名称 现在,棘手的部分来了:我需要将关键字与标识符分开,但它们可能看起来很相似,所以我需要一个正则表达式模式,该模式不敏感地匹配标识符的大小写,其他什么都不需要 我提出的解决方案如下: 每个关键字由以下
/(?i)关键字)(?!\w)/
将对以下子模式应用不区分大小写的匹配(?i)
将不接受关键字后面的任何单词字符(a-z、0-9等)(?!\w)
- 这些字符将不会成为匹配的一部分
顺便说一下,使用标记器匹配整个字符串而不是单个字符的想法来自Parse::Eyapp文档。我首先从一个字符一个字符的语法开始,但这种方法不是很优雅,似乎与解析器生成器的灵活性质相矛盾。写起来也很麻烦。如果你想解析一种语言,也许更适合你。这是一个例子。您也可以使用。这似乎属于“可能”,但我不要求在此进行代码审查。我更希望有一些关于为编程语言开发一个好的标记器和(可能)语法的提示。我想我应该说得更清楚。看来你走对了方向。当我使用lex/flex时,我会为我的关键字提供类似的模式。最重要的是要确保在关键字(你正在做的)周围标记“单词边界”,并在常规标识符之前匹配所有关键字标记。不确定,但也许你可以使用
\b
而不是(?!\w)
。谢谢你的提示,@HamZa。我想这也行(而且会更优雅)。哇,这两个看起来都很强大。我已经花了几天的时间用yacc/yapp把我的手弄脏了,但是现在切换还不算晚。自从编写了教程以来,Marpa变得更容易使用,功能也更强大。更多最新的教程是,和。到目前为止,我尝试了Regexp::Grammars
。它的语法比Parse::Eyapp更通用,我喜欢它基本上增强了Perl的正则表达式。不幸的是,我撞到了一辆汽车。让我们看看Marpa,Marpa看起来真的很有希望,只是在我的例子中,由于量词对单语句规则的限制,它需要更多明确的规则。根据我最初的问题,有人能给我一个提示,我如何在Marpa中实现不区分大小写的关键字匹配吗?字符串匹配失败,但字符类也没有真正的帮助。我真的需要写一些像[kK][eE][yY][wW][oO][rR][dD]这样的东西吗?我把我最后的评论变成了。