我正在编写用于解析计算机语言的语法,可以与Parse::Eyapp一起使用。这是一个 Perl 包,它简化了为常规语言编写解析器。它类似于 yacc 和其他 LALR 解析器生成器,但有一些有用的扩展,例如根据正则表达式定义标记。
我要解析的语言使用关键字来表示部分和描述控制流。它还支持用作数据占位符的标识符。标识符永远不能与关键字同名。
现在,棘手的部分来了:我需要将关键字与标识符分开,但它们可能看起来很相似,所以我需要一个不区分大小写地匹配标识符的正则表达式模式,仅此而已。
我想出的解决方案如下:
- 每个关键字由以下形式的标记标识:
/((?i)keyword)(?!\w)/
(?i)
将为以下子模式应用不区分大小写的匹配(?!\w)
不接受关键字后面的任何单词字符(az、0-9 等)- 这些字符将不属于匹配项
- 与另一个关键字开头相同的关键字列在较长关键字之后,因此它们首先匹配
- 用于匹配标识符的标记位于最后,因此仅在没有识别到关键字时才会匹配
到目前为止,我想出的标记定义和部分语法运行良好,但仍有很多工作要做。然而,这不是我的问题。
我想问的是,我在这里走对了吗?是否有更好、更简单的正则表达式来匹配这些关键字?我应该停止并完全使用不同的方法进行语言解析吗?
顺便说一句,使用标记器匹配整个字符串而不是单个字符的想法来自 Parse::Eyapp 文档。我首先从逐个字符的语法开始,但这种方法不是很优雅,而且似乎与解析器生成器的灵活性相矛盾。写起来也很麻烦。