Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.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
Compiler construction 如何检查所有代码路径是否都返回值_Compiler Construction_Semantics - Fatal编程技术网

Compiler construction 如何检查所有代码路径是否都返回值

Compiler construction 如何检查所有代码路径是否都返回值,compiler-construction,semantics,Compiler Construction,Semantics,我正在为将在我的应用程序中运行的嵌入式脚本语言编写编译器。我目前正在研究编译器的语义分析部分。理论上,我想知道如何检查给定脚本中的所有代码路径是否都将返回一个值。当不是所有的代码路径都返回一个值时(大多数都是问题),执行a只会产生人们在自己的代码中看到错误的结果,因此我无法找到解释如何进行实际检查的来源。谁能给我指出正确的方向吗 注意: 我特别寻找一个权威的来源概述了严格的算法,如果可能的话 您可以通过递归遍历AST来实现这一点。例如: 如果第一条语句在所有控制路径上返回,或者第二条语句在所有

我正在为将在我的应用程序中运行的嵌入式脚本语言编写编译器。我目前正在研究编译器的语义分析部分。理论上,我想知道如何检查给定脚本中的所有代码路径是否都将返回一个值。当不是所有的代码路径都返回一个值时(大多数都是问题),执行a只会产生人们在自己的代码中看到错误的结果,因此我无法找到解释如何进行实际检查的来源。谁能给我指出正确的方向吗

注意:
我特别寻找一个权威的来源概述了严格的算法,如果可能的话

您可以通过递归遍历AST来实现这一点。例如:

  • 如果第一条语句在所有控制路径上返回,或者第二条语句在所有控制路径上返回,则所有控制路径上返回的语句序列

  • 如果“if”和“else”分支在所有控制路径上返回,或者“if”语句始终为true,则if语句在所有控制路径上返回

  • 只有当“while”条件始终为true时,while循环才会在所有控制路径上返回

  • return语句在所有控制路径上返回


希望这有帮助

那很有帮助,谢谢。但我希望有一个更严格的算法,也许是CS教科书中的东西。我在Dragon Book和我所学的其他编译器教科书中找不到任何东西。我所描述的应该很容易转换为AST上的自上而下递归下降,就像计算表达式的类型一样。我认为这很简单,但我正在寻找严格的。我想知道我正在实现的是绝对可靠的。如果您正在寻找权威参考,您可能应该更新问题,以请求指向现有受信任资源的链接。@MrCodeMnky如果您想要严格,您可能希望用形式语义描述您的语言,然后你所追求的属性就变成了某种逻辑的证明。然后,您的问题就归结为在逻辑中进行证明,根据涉及的逻辑,这种证明有多种技术。你很可能会在语法树上进行结构归纳,例如,我认为应该提到的另一种方法是让所有语句都返回一个值。然后,问题通过设计就消失了。@KubaOber我考虑过这一点,但我更喜欢强制程序员使用返回语句的惯例,以减少编程错误的可能性。