compiler-construction - 编译器如何处理运行时错误消息中的行号

标签 compiler-construction runtime lexical-analysis

几乎所有的编译器都会返回一个行号和错误信息。我想知道从编译器设计的角度来看,编译器如何根据不同阶段处理行号消息?谢谢。

  • 扫描仪
  • 解析器
  • AST 数据结构
  • 代码生成

  • 另外的:
  • 运行时环境
  • 机器翻译
  • 最佳答案

    我为我的类作业实现了一个相当简单的编译器。它是 Pascal 的一个子集,但有一些其他限制。

    编译器是一种将一种语言翻译成另一种语言的工具。它通过执行错误检查然后生成输出代码(如果可能)来做到这一点。通常,编译器的流水线大致相当于:

    Input Code -> Lexical Analyzer(Scanner) -> Syntax Analyzer -> Semantic Analyzer -> Code Generator -> Output Code *



    由于我的语言很简单,我可以做出一系列假设,例如一条指令只能在一行中。我的词法分析器使用正则表达式来检查不应该存在的字符,例如“不是数字、字母、“(”、“、”“.”等的字符。”我将文件读入一个字符串列表,其中每个字符串都是下一行,所以如果我扫描一行并发现错误,我会返回索引 + 1 是行的编号。

    使用语法分析器(解析器)检查例如“如果变量名以字母开头”算法是类似的。

    当我扩展解析器时,我将一个 token 与代码中的行相关联,以便在出现错误时返回它。

    我不知道现代编译器如何解决这个问题,但我猜这也是 AST 和行号的某种关联,因为一个 AST 可能在几行中(嗯,这取决于语言)。

    使用代码生成编译器知道代码是正确的(据他们所知)并且返回错误不是关于代码而是编译器或进程有问题(错误,没有足够的内存,无法写入位置等)。

    运行时环境和机器解释也可以有编译器,例如JIT 但错误消息返回通常表示编译器或运行时中的错误,而不是代码。

    *请注意,这是非常简单的 3 次传递模型。 Modern compilers have a lot more .

    编辑:我发现 AST 有一个字段指示行号和一个错误文件(对于每个节点)。

    关于compiler-construction - 编译器如何处理运行时错误消息中的行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10163204/

    相关文章:

    c - 如何在 C 项目中导入您自己的 HEADER (.h) 文件

    java - 将类转换为不相关的接口(interface)

    javascript - 吉森忽视了我的一条规则

    javascript - 词法分析器需要提供什么功能?

    regex - 语法分析器如何忽略输入中的空格

    gcc 中的编译器优化

    java - 如何从 Java 源代码生成 AST?

    Android 手机的 Java 编译器

    Java exec 或运行时无法与 ssh 一起使用

    object - QTP 中的 .Exist 超时如何工作?