不区分大小写的关键字匹配

2024-05-03

我正在编写一种用于解析计算机语言的语法,可以与解析::Eyapp http://search.cpan.org/~casiano/Parse-Eyapp-1.182/lib/Parse/Eyapp.pod。这是一个 Perl 包,可以简化常规语言解析器的编写。它类似于 yacc 和其他 LALR 解析器生成器,但具有一些有用的扩展,例如根据正则表达式定义标记。

我想要解析的语言使用关键字来表示部分并描述控制流。它还支持用作数据占位符的标识符。标识符永远不能与关键字同名。

现在,棘手的部分来了:我需要将关键字与标识符分开,但它们可能看起来相似,所以我需要一个不区分大小写的匹配标识符的正则表达式模式,仅此而已。

我想出的解决方案如下:

  1. Each keyword is identified by a token of the following form: /((?i)keyword)(?!\w)/
    • (?i)将为以下子模式应用不区分大小写的匹配
    • (?!\w)不接受关键字后的任何单词字符(a-z、0-9 等)
    • 这些字符不会成为匹配的一部分
  2. 与另一个关键字开头相同的关键字列在较长关键字之后,因此它们首先匹配
  3. 用于匹配标识符的标记位于最后,因此仅当没有识别到​​关键字时才会匹配

到目前为止,我提出的标记定义和部分语法运行良好,但仍有很多工作要做。然而,这不是我的问题。

我想问的是,我走在正确的轨道上吗?有没有更好、更简单的正则表达式来匹配这些关键字?我应该停止并使用不同的语言解析方法吗?

顺便说一句,使用分词器来匹配整个字符串而不是单个字符的想法来自 Parse::Eyapp 文档。我首先从逐个字符的语法开始,但这种方法不是很优雅,并且似乎与解析器生成器的灵活性相矛盾。写起来也很麻烦。


如果你想解析一种语言,Marpa http://jeffreykegler.github.io/Marpa-web-site/也许更适合你。这是一个tutorial http://jeffreykegler.github.io/Ocean-of-Awareness-blog/individual/2012/11/pattern_search.html。你也可以使用正则表达式语法 https://metacpan.org/module/Regexp%3a%3aGrammars.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不区分大小写的关键字匹配 的相关文章

随机推荐