【问题标题】:Parser and abstract syntax tree解析器和抽象语法树
【发布时间】:2013-08-19 01:18:28
【问题描述】:

最近我决定尝试实现一种非常小的语言,只是为了看看我能做什么。在过去的几个小时里,我设法为我的语言编写了一个词法分析器,效果很好。所以在阅读了理论和东西之后,我明白下一步是编写一个解析器。解析器的工作对我来说仍然有点不清楚,(我正在编写一种小型解释语言作为开始,所以事情将直接在代码中完成)它是否通过标记,理解含义,然后执行代码所说的/生成代码(用于编译器)?或者我读过抽象语法树,这是我应该用解析器构造的东西吗?我不太确定 AST 到底是什么…… 所以我想我的问题是,在词法分析器之后我的下一步是什么?解析器的工作是什么?最后但并非最不重要的一点是抽象语法树的作用是什么?

感谢您的帮助!

【问题讨论】:

  • 你能做的最好的事情就是去找任何关于编译器的书去读一读。对这些部分的作用有一些模糊的概念并尝试将工作工具放在一起不会非常有效,而且您不会了解那些构建编译器的人花了 50 年时间弄清楚了什么。 Aho/Ullman/Sethi 关于编译器的书是 标准参考书,它将直接回答您的问题。

标签: parsing tokenize lexer abstract-syntax-tree


【解决方案1】:

我不确定您是如何编写词法分析器的,但解决此问题的标准方法是使用flex(以前的lex)编写词法分析器并使用yacc 编写解析器。两者的结合使得实现多种语言变得非常容易。

【讨论】:

  • 是的,但这不是很有挑战性,重点是挑战自己。我的词法分析器是手写的!假设解析器的工作是确定词法分析器提供的标记的语义,我也编写了一个基本的工作解析器,我只是不能 100% 确定解析器应该做什么。
  • @APott 你提出的挑战不会有帮助。如果你试图在沙子的基础上建造一座巨大的大厦,你可能会失败,但不是出于有趣的原因。您从做出假设开始,甚至没有检查它们,甚至没有正确使用这些词。在开始之前跳过基础教育不是一个好主意。
  • 分词器将输入分解为分词,词法分析器分析这些分词并识别它们是什么类型的分词。解析器查看这些类型是什么以及它们进入的顺序以确定程序“意味着”什么。解析器将这些类型转换为“抽象语法树”,它基本上是正在编译的程序的中间表示。然后将 AST 转换为实际的可执行代码。
  • 哦,哇,我显然一直在阅读错误的资料......我使用的术语不正确,感谢 cmets 伙计们!
  • @Apott,使用 flex 和 yacc 编写编译器或解释器非常具有挑战性。
猜你喜欢
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多