编译器在实际阅读源程序的时候,首先经过扫描程序执行语法分析(Lexical analysis):它将字符序列收集到称做记号(token)的有意义单元中,记号同天然语言,如英语中的字词。
字体
例如在下面的代码行中:blog
a[index] = 4 + 2token
这个代码包括了12个非空字符,但只有8个记号:编译器
每个记号均由一个或多个字符组成,在进一步处理以前它已被收集在一个单元中。编译
语法分析程序从扫描程序中获取记号形式的源代码,并定义程序结构的语法分析(syntax analysis),这与天然语言中句子的语法分析相似。语法分析定义了程序的结构元素极其关系。一般将语法分析的结果表示为分析树(parse tree)或语法树(syntax tree)。语法
例如:仍是那行C代码,它表示一个称为表达式的结构元素,该表达式是一个由左边为下标表达式、右边为整型表达式的赋值表达式组成。这个结构可按下面的形式表示为一个分析树:程序
请注意,分析树的内部节点均由其表示的结构名标示出,而分析树的叶子则表示输入中的记号序列(结构名以不一样字体表示以示与记号的区别)。im
分析树对于显示程序的语法或程序元素颇有帮助,可是对于表示该结构却显得力不从心了。分析程序更趋向于生成语法树,语法树是分析树中所包含信息的浓缩(有时由于语法树表示从分析树中的进一步抽取,因此也被称为抽象的语法树(abstract syntax tree))。下面是C赋值语句的抽象语法树的例子:img
ps: 昨天看到这个,原本想马上记录下来的,由于种种别的事情,耽误了。o(︶︿︶)o 唉,只有今天来作了。语言
我本想找一个现成的介绍之类的转载过来,这样可以省很多力气。
但是,没有合适的。
以上均是个人手打,半个多小时啊~