Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.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
Java 编程一个“编译器”-知道{(打开器)是否}(关闭)的任何方法?_Java_Regex_Compiler Theory_Language Theory - Fatal编程技术网

Java 编程一个“编译器”-知道{(打开器)是否}(关闭)的任何方法?

Java 编程一个“编译器”-知道{(打开器)是否}(关闭)的任何方法?,java,regex,compiler-theory,language-theory,Java,Regex,Compiler Theory,Language Theory,好的,我有一个练习来构建一种java编译器。我不会得到太多的细节。 基本上,我想知道是否可以使用一个可以识别结束括号的正则表达式。 例如,这将是一项法律投入 void foo(){ asd } 而这不会是 void foo(){ asd if (){ asd } 如您所见,只有1个closer}表示2个opener{,使其成为无效输入。是否有任何方法可以使用正则表达式并确定外观数是否匹配?无法使用正则表达式检查括号是否正确,因为要检查是否需要跟踪已打开的括

好的,我有一个练习来构建一种java编译器。我不会得到太多的细节。 基本上,我想知道是否可以使用一个可以识别结束括号的正则表达式。 例如,这将是一项法律投入

void foo(){
   asd
}
而这不会是

void foo(){
   asd
   if (){
      asd
   }

如您所见,只有1个closer}表示2个opener{,使其成为无效输入。是否有任何方法可以使用正则表达式并确定外观数是否匹配?

无法使用正则表达式检查括号是否正确,因为要检查是否需要跟踪已打开的括号数等,但正则表达式无法做到这一点


我建议你,特别是如果你想构造一个编译器,要熟悉形式语言理论。例如,这篇维基百科文章在形式语言理论的上下文中提供了一些关于正则表达式的见解:

不可能用正则表达式检查正确的括号,因为要检查t您需要跟踪打开了多少方括号等,但正则表达式无法做到这一点


我建议你,特别是如果你想构建一个编译器,熟悉形式语言理论。例如,这篇维基百科文章在形式语言理论的背景下提供了一些关于正则表达式的见解:

最简单的简化?回答:

如果分析语法,通常会直接或间接地维护某种类型的堆栈。对于每个左括号,都会将元素推送到堆栈中。看到右括号后,通过检查堆栈可以知道它是否与最后一个左括号匹配

还要注意,有很多方法可以打开一个括号,{只是其中之一。
因此,堆栈不仅告诉您有多少个开括号,还告诉您在给定的解析状态下哪种类型的闭括号是合法的。

最简单的简化?回答:

如果分析语法,通常会直接或间接地维护某种类型的堆栈。对于每个左括号,都会将元素推送到堆栈中。看到右括号后,通过检查堆栈可以知道它是否与最后一个左括号匹配

还要注意,有很多方法可以打开一个括号,{只是其中之一。
因此,堆栈不仅告诉您有多少个开括号,还告诉您在给定的解析状态下哪种类型的闭括号是合法的。

如果您使用C,好的工具对于令牌是灵活的,对于gramar是野牛


JFlex和Cup,如果你想用Java实现,也可以使用Visitor paddern来获得更好的程序结构

如果你使用C,好的工具是Flex用于令牌,Bison用于gramar


JFlex和Cup,如果你想用Java实现,也可以使用Visitor paddern来获得更好的程序结构

标准正则表达式只能表示a的语法,而a正是a所接受的语言类。DFA只有有限的状态数,而方括号可以无限期嵌套;一种可能有i的语言nfinite级别的嵌套不是常规语言,不能仅由正则表达式解析

虽然大多数语言中的正则表达式库不仅仅是标准正则表达式,而且能够解析一些非正则语言,但它们通常需要过于复杂的表达式才能解析


通常,要检查括号语言的良好嵌套,您需要一个CFG解析器。CFG严格地比正则表达式强,即如果语法可以用RE表示,那么它可以用CFG表示,反之不一定正确。

标准正则表达式只能表示a的语法,这正是DFA接受的一类语言。DFA只有有限个状态,而方括号可以无限嵌套;可能有无限嵌套级别的语言不是常规语言,不能仅由正则表达式解析

虽然大多数语言中的正则表达式库不仅仅是标准正则表达式,而且能够解析一些非正则语言,但它们通常需要过于复杂的表达式才能解析


一般来说,要检查括号语言的良好嵌套,您需要一个CFG解析器。CFG严格地比正则表达式强,即,如果语法可以用RE表示,那么它可以用CFG表示,反之则不一定正确。

了解标记化器。正则表达式不用作表达式是有原因的编译器的主要实现工具。正则表达式可以用作标记化/编译的一部分,但有些语言情况不能由正则表达式处理。通常,这是通过堆栈完成的。如果要处理任意级别的嵌套,则不能使用标准正则表达式。是否允许使用specialized工具,如ANTLR、JavaCC或VisualLangLab?不适用于所有ab
当然,只是标准的Java1.7类。它不应该是一个真正的编译器。。。我知道如何使用堆栈或级别计数器来计算数字,我只是想知道是否可以使用正则表达式来识别这些数字。感谢您的帮助。了解Tokenizer。正则表达式没有被用作编译器的主要实现工具是有原因的。正则表达式可以作为标记化/编译的一部分使用,但有些语言情况是正则表达式无法处理的。通常情况下,这是通过堆栈完成的。如果您希望处理任意级别的嵌套,则标准正则表达式不能用于此目的。是否允许您使用诸如ANTLR之类的专用工具,JavaCC或VisualLangLab?不适用于上述所有类,只适用于标准java 1.7类。它不应该是一个真正的编译器。。。我知道如何使用堆栈或级别计数器来计算数字,我只是想知道是否可以使用正则表达式来识别这些数字。谢谢你的帮助。