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

时间:2013-07-01 15:15:24

标签: regex perl yacc

我正在编写用于解析计算机语言的语法,可以与Parse::Eyapp一起使用。这是一个Perl包,简化了为常规语言编写解析器的过程。它类似于yacc和其他LALR解析器生成器,但有一些有用的扩展,比如用正则表达式定义标记。

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

现在,这里有一个棘手的部分:我需要将关键字与标识符分开,但它们可能看起来相似,所以我需要一个与标识符不区分的正则表达式模式,而不需要其他任何内容。

我想出的解决方案如下:

  1. 每个关键字都由以下格式的标记标识:/((?i)keyword)(?!\w)/
    • (?i)将对以下子模式应用不区分大小写的匹配
    • (?!\w)将不接受关键字
    • 后的任何字词(a-z,0-9等)
    • 这些角色不会成为比赛的一部分
  2. 与较长关键字的开头相同的关键字列在较长的关键字后面,因此它们首先匹配
  3. 匹配标识符的令牌是最后一个,因此只有在没有识别出关键字时才匹配
  4. 到目前为止,我提出的令牌定义和语法的一部分工作得很好,但仍有很多工作要做。但是,这不是我的问题。

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

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

1 个答案:

答案 0 :(得分:2)

如果您想解析一种语言,Marpa可能更适合您。这是一个tutorial。您也可以使用regexp grammars