编程语言的解析器应该做什么?

时间:2011-09-18 12:46:18

标签: c++ parsing programming-languages

我已经编写了一个返回令牌的词法分析器,现在我正在处理解析器。我有一个问题。

想象一下这段代码示例:

print("Hello, world!")

词法分析器返回四个标记(print("Hello, world!"))。最终的程序应该打印字符串“Hello,world!”。

但解析器应该怎么做?如果解析器已经执行了代码,它是否应该返回由另一个对象处理的内容(以及什么)?

5 个答案:

答案 0 :(得分:5)

解析器应生成abstract syntax tree,它是程序的内存表示形式。解析后可以遍历此树以执行代码生成。我建议你读一些关于这个主题的好书,也许是一本involving dragons

答案 1 :(得分:1)

  

解析器应该做什么?

解析器的典型作用是读取令牌流,并从中构建parse treeabstract syntax tree

  

解析器是否已经执行了代码

没有。那不是解析。

答案 2 :(得分:1)

通常,解析器不执行任何操作。解析器通常采用输入(文本或二进制)并生成内存中的表示,仅此而已......但已经很多了!

如果您已有Lexer,那么第二步通常是执行语义分析,以生成Abstract Syntax Tree

这意味着,产生以下形式的东西:

(FunctionCall "print" [
    (StringLiteral "Hello, World!")
    ]
)

答案 3 :(得分:0)

它应该返回abstract syntax tree

答案 4 :(得分:0)

解析器基本上应该做两件事:

  1. 生成一种中间文本形式,通常以树或反向波兰形式,代码生成器可以使用。
  2. 清楚准确地报告遇到的任何错误,识别失败的行号,错误的确切原因(在合理的非技术说明中),并尽可能地确定行内的位置或元素的身份导致解析器“窒息”。