Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 不区分大小写的关键字匹配_Regex_Perl_Yacc - Fatal编程技术网

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

Regex 不区分大小写的关键字匹配,regex,perl,yacc,Regex,Perl,Yacc,我正在写一个语法来解析一种计算机语言,它可以与。这是一个Perl包,它简化了常规语言解析器的编写。它类似于yacc和其他LALR解析器生成器,但有一些有用的扩展,比如用正则表达式定义标记 我想要解析的语言使用关键字来表示部分和描述控制流。它还支持用作数据占位符的标识符。标识符不能与关键字具有相同的名称 现在,棘手的部分来了:我需要将关键字与标识符分开,但它们可能看起来很相似,所以我需要一个正则表达式模式,该模式不敏感地匹配标识符的大小写,其他什么都不需要 我提出的解决方案如下: 每个关键字由以下

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

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

现在,棘手的部分来了:我需要将关键字与标识符分开,但它们可能看起来很相似,所以我需要一个正则表达式模式,该模式不敏感地匹配标识符的大小写,其他什么都不需要

我提出的解决方案如下:

  • 每个关键字由以下形式的标记标识:
    /(?i)关键字)(?!\w)/
    • (?i)
      将对以下子模式应用不区分大小写的匹配
    • (?!\w)
      将不接受关键字后面的任何单词字符(a-z、0-9等)
    • 这些字符将不会成为匹配的一部分
  • 与另一个关键字开头相同的关键字列在较长的关键字后面,因此它们首先匹配
  • 用于匹配标识符的标记位于最后,因此它仅在未识别关键字时匹配
  • 到目前为止,我提出的标记定义和部分语法工作得很好,但仍有很多工作要做。然而,这不是我的问题

    我想问的是,我走对了吗;是否有更好、更简单的正则表达式来匹配这些关键字?我是否应该停止使用另一种语言解析方法


    顺便说一下,使用标记器匹配整个字符串而不是单个字符的想法来自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]这样的东西吗?我把我最后的评论变成了。