初识编译原理(一)

版权声明:本文为博主原创文章,转载需标明出处 https://blog.csdn.net/Jason_yesly/article/details/84204623

编译的本质是一个翻译的过程,编译的输入是一个高级语言程序,输出是汇编语言程序或者机器语言程序。

过程:

源语言句子 句子的语义 目标语言句子 1.分析源语言<-语义分析<-语法分析<-词法分析 2.生成目标语言 源语言句子 句子的语义 目标语言句子

词法分析/扫描(Scanning)

词法分析的主要任务:

从左向右逐行扫描源程序的字符,识别出各个单词,确认单词的类型.
将识别出的单词转换成统一的机内表示–词法单元(token)形式

token:<种别码,属性值>

种别码:单词的词性

单词类型 种别 种别码
关键字 program、if、else、then… 一词一码
标识符 变量名、数组名、记录名、过程名… 多词一码
常量 整型、浮点型、字符型、布尔型… 一词一码
运算符 算术(+ - * / ++ --)关系(> < != == <=)逻辑(& ~) 一词一码或一型一码
界限符 ; ( ) = { }… 一词一码

语法分析(parsing)

语法分析器(parser)从词法分析器分析输出的token序列中识别出各类短语,并构造语法分析树(parse tree)

语义分析

语义分析主要任务:

  • 收集标识符的属性信息
    • 种属(Kind)
      • 简单的变量、复合变量(数组、记录。。)、过程。。。
    • 类型(Type)
      • 整型、实型、字符型、布尔型、指针型。。
    • 存储位置、长度
    • 变量的值
    • 过程的作用域
    • 参数和返回信息
      • 参数个数、参数类型、参数传递方式、返回值类型。。。
        以上信息都会存放在 符号表
  • 语义检查
    • 变量或过程未经声明就使用
    • 变量或过程名重复使用
    • 运算分量类型不匹配

文法

字母表(Alphabet)

  • 字母表 是一个有穷符号集合

    • 符号:字母、数字、标点符号。。。

文法的定义

G=(Vt,Vn,P,S)

  • Vt:终结符集合
    终结符(terminal symbol) 是文法所定义的语言的基本符号,有时也成为token
    • 如:Vt={girl,boy,look,like}
  • Vn:非终结符集合
    非终结符(nonterminal) 是用来表示语成分的符号,有时也称为“语法变量”
    • 如:Vn={<句子>,<名词短语>,<动词短语>,<名称>…}

注意:

1. Vt、Vn相交为空集

2. Vt、Vn相并表示 文法符号集
  • P:产生式集合
    产生式(production)描述了将终结符和非终结符组合成串的方法。

产生式的一般形式:

graph LR
a-->B

读作:a定义为B
-

  • S: 开始符号
    S属于Vn。开始符号(start symbol)表示的是该文法中最大的语法成分

符号约定

  • 终结符
    • 字母表中排在前面的小写字母,如:a、b、c
    • 运算符,如:+、* 等
    • 标点符号,如括号、逗号
    • 数字,0、1、…9
    • 粗体字符串,如:id、if
  • 非终结符
    • 字母表中排在前面的大写字母,如:A、B、C
    • 字母S。通常表示开始符号
    • 小写、斜体的名字,如:expr、_stmt_等
    • 代表程序构造的大写字母,如:E(表达式)、T(项)、F(因子)
  • 字母表中排在后面的大写字母,如:X、Y、Z
    表示文法符号(即终结符或非终结符)
  • 字母表中排在后面的小写字母 (主要是 u,v、、、z)
    表示终结符号串(包括空串
  • 小写希腊字母,表示文法符号串(包括空串

猜你喜欢

转载自blog.csdn.net/Jason_yesly/article/details/84204623