编译期间和运行时的错误类型

Ret*_*eti 4 language-agnostic programming-languages

我的计算机语言课的作业中有这个问题。我试图弄清楚每个含义是什么,但是我陷入了困境。

计算机程序中的错误可以根据检测到的时间进行分类,如果在编译时检测到,则由编译器的哪一部分进行检测。使用您喜欢的编程语言,给出以下示例:

(a)扫描仪检测到的词法错误。

(b)语法错误,由解析器检测到。

(c)通过语义分析(在编译时)检测到的静态语义错误。

(d)由编译器生成的代码(在运行时)检测到的动态语义错误。

对于(a),我认为这是正确的: int char foo;

对于(b),int foo(无分号)

对于(c)和(d),我不确定要问什么。

谢谢您的帮助。

Sid*_*war 5

我会试一试。我的想法是:

一种。int foo +; (foo +是无效的标识符,因为+在标识符中不是有效的字符)

b。foo int; (语法错误是指语法无效的任何错误-可能是由于单词放置错误,拼写错误,分号丢失等)。

C。静态语义错误是逻辑错误。例如,将float作为数组的索引传递-arr [1.5]应该是SSE。

d。我认为像NullReferenceException这样的异常可能是DME的一个示例。不确定,但是在编译时引发异常的协变量返回(某些语言)也可能属于此类。另外,在另一个对象中传递错误类型的对象(例如在运行时在Person对象中传递Cat可能符合DME的资格)。最简单的示例是尝试访问超出数组范围的索引。

希望这可以帮助。


Jef*_*ado 5

我认为了解什么是扫描仪,什么是解析器以及它们如何参与编译过程很重要。

(我会尽力在高层次的解释中)

扫描程序将字符序列(源文件)转换为令牌序列。例如,看到文本if 234 )并转换为令牌IF INTEGER RPAREN(有更多内容,但对于示例来说应该足够了)。

您可以考虑扫描仪如何工作的另一种方法是,它获取文本并确保使用正确的关键字而不是拼写错误。它必须能够将整个源文件转换为关联的语言的识别标记,并且这在每种语言之间都不同。换句话说,“每一段文字都对应于一种语言可以理解的结构”。或更好地举一个例子,“书中所有这些单词都属于英语吗?”


解析器获取一系列令牌(通常从扫描仪获取),并且(除其他事项外)查看其是否格式正确。例如,C变量声明的形式为Type Identifier SEMICOLON

解析器检查“按此顺序的令牌序列对我有意义吗?” 类似地,“这个英语单词序列(带有标点符号)是否构成完整的句子?”


C要求在编译程序时发现错误。D要求您在成功编译程序后运行该程序时看到的错误。现在,您应该应该能够区分这两个。

我希望这可以帮助您更好地理解并简化回答。