Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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
C# 用于匹配编程语言(如块)的正则表达式_C#_Regex - Fatal编程技术网

C# 用于匹配编程语言(如块)的正则表达式

C# 用于匹配编程语言(如块)的正则表达式,c#,regex,C#,Regex,我正在尝试用c语言编写一个小型脚本语言# 当前正在执行块解析器 我一直在为block制作正则表达式。 积木可以有∞ 子块的时间 这就是我需要抓住的 { naber(); } { int x = 5; x = 2; if (x == 5) { x = 5; } } 我试过了,但没有成功 \{[^{}]*|(\{[^\{\}]\})*\} 这是我的第一篇帖子,请宽恕我吧Regex不会帮你的。如果您正在设计一种可能要执行的脚本语言,它具

我正在尝试用c语言编写一个小型脚本语言# 当前正在执行块解析器 我一直在为block制作正则表达式。 积木可以有∞ 子块的时间

这就是我需要抓住的

{ 
    naber(); 
}
{
    int x = 5;
    x = 2;
    if (x == 5) {
        x = 5;
    }
}

我试过了,但没有成功

\{[^{}]*|(\{[^\{\}]\})*\}

这是我的第一篇帖子,请宽恕我吧

Regex不会帮你的。如果您正在设计一种可能要执行的脚本语言,它具有块和子块,那么您需要使用正则表达式来表示

要解释上下文无关语言,需要以下步骤(简化):

  • 将代码字符串转换为令牌/符号列表。这个过程由一个通常称为Lexer的组件完成
  • 根据语法规则(如运算符优先级、嵌套代码块等)将标记转换为结构化树(AST-抽象语法树)。这是由一个通常称为解析器的组件完成的
  • 从这里出现了几个选项,要么将AST翻译成本机代码,要么将中间代码(如字节码)转换成另一种语言;或者您可以直接在内存中运行它,这是最简单的方法,也可能是您想要/需要的

  • 这些应该已经有很多概念可供搜索,但所有这些都可以通过类似的工具轻松实现。很明显,ANTLR可能还有其他替代方法,我现在不记得了。

    我同意有人说,regex不是您应该使用的解析代码。 也就是说,在某些注册引擎上,可以匹配字符并在块中获取代码

    这可能适合您
    {((?>[^{}]+|(?R))*)}
    。如果正则表达式引擎支持递归模式,那么就可以对代码进行解析


    这里有更多关于它的信息

    为什么要使用正则表达式而不是用类似的东西来编写实际的解析器?不幸的是,编程语言(至少是您尝试创建的类型)不是正则的,因此您无法用正则表达式来解析它们。在某个时刻,你会遇到麻烦,必须使用或编写一个真正的解析器,你不能有一个正则表达式。如果您在Linux中这样做,我建议您使用YACC(另一个编译器),它使用LEX(类似于REGEX)作为表达式。你的表达式是1)“intx=5”2)“x=2”3)x==5 4)x=5 5)如果()编译器你必须定义你的语言和表达式。你不能在一个结构中同时做这两件事。OP缺少语言语法。如果
    {(?>[^{}]+|(?){{124;(?)})*}
    解决了“语言”的问题,那么就使用它。如果
    {
    }
    可以出现在函数/方法体定界符以外的任何上下文中,则不能依赖平衡结构,必须编写解析器。