Parsing 解析器和抽象语法树

Parsing 解析器和抽象语法树,parsing,tokenize,lexer,abstract-syntax-tree,Parsing,Tokenize,Lexer,Abstract Syntax Tree,最近我决定尝试实现一种非常小的语言,看看我能做些什么。在过去的几个小时里,我为我的语言编写了一个词法分析器,它运行得非常好。所以在阅读了理论和其他东西之后,我明白了下一步是编写解析器。解析器的工作对我来说仍然有点不清楚,(我正在编写一个很小的解释性语言作为开始,所以事情将直接在代码中完成)它是否通过标记,理解含义,然后按照代码所说的做/生成代码(用于编译器)?或者我读过抽象语法树,这是我应该用解析器构造的东西吗?我不太确定AST到底是什么,真的。。。 所以我想我的问题是,我下一步要做什么?解析器

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


谢谢你的帮助

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

是的,但那不是很有挑战性,关键是要挑战我自己。我的lexer是手写的!假设解析器的工作是确定lexer提供的标记的语义,那么我也编写了一个基本的工作解析器,我只是不能100%确定解析器应该做什么。@APott您提出的挑战不会有帮助。如果你试图在沙子的地基上建造一座巨大的建筑物,你很可能会失败,但这并不是因为有趣的原因。你是从假设开始的,你甚至没有检查它们,甚至没有正确地使用这些词。在开始之前跳过基础教育不是一个好主意。标记器将输入分解为标记,lexer分析这些标记并确定它们是什么类型的标记。解析器查看这些类型是什么以及它们的顺序,以确定程序的“含义”。解析器将这些类型转换为“抽象语法树”,它基本上是正在编译的程序的中间表示形式。然后AST被转换成实际的可执行代码。哦,哇,我显然读错了源代码。。。我使用的术语不正确,谢谢大家的评论@Apott,使用flex&yacc编写编译器或解释器是一件非常有挑战性的事情。你能做的最好的事情就是去读任何关于编译器的书。对这些片段的功能有一些模糊的概念,并试图将其组合成一个工作工具,这将不会非常有效,而且你也不会了解那些构建编译器的人花了50年的时间才弄明白了什么。Aho/Ullman/Sethi关于编译器的书是标准参考,它将直接回答您的问题。