我正在编写用于解析计算机语言的语法,可以与Parse::Eyapp一起使用。这是一个Perl包,简化了为常规语言编写解析器的过程。它类似于yacc和其他LALR解析器生成器,但有一些有用的扩展,比如用正则表达式定义标记。
我想要解析的语言使用关键字来表示部分并描述控制流。它还支持用作数据占位符的标识符。标识符永远不能与关键字同名。
现在,这里有一个棘手的部分:我需要将关键字与标识符分开,但它们可能看起来相似,所以我需要一个与标识符不区分的正则表达式模式,而不需要其他任何内容。
我想出的解决方案如下:
/((?i)keyword)(?!\w)/
(?i)
将对以下子模式应用不区分大小写的匹配(?!\w)
将不接受关键字到目前为止,我提出的令牌定义和语法的一部分工作得很好,但仍有很多工作要做。但是,这不是我的问题。
我想问的是,我在这里走在正确的轨道上;是否有更好,更简单的正则表达式来匹配这些关键字?我应该停止并使用不同的方法进行语言解析吗?
顺便说一句,使用标记生成器来匹配整个字符串而不是单个字符的想法来自Parse :: Eyapp文档。我首先开始使用逐字符语法,但这种方法不是很优雅,似乎与解析器生成器的灵活性相矛盾。写作也非常麻烦。