`
lobin
  • 浏览: 443872 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

编译器总体步骤

token

 

token、symbol、symbol table and the symbols definitions in grammar

 

 

语法分析

Syntax Analysis

词法分析出一个token后传给语法分析器,语法分析器根据文法从开始符号进行推导(以开始符号进行推导的规则,也可以称作是一个产生式)。词法分析器对输入字符串进行扫描分析的时候,是

按照从左至右依次进行扫描,按照这种方式扫描出来的token依次传给语法分析器进行解析,那么后面的推导也就是最左(leftmost)推导。

 

语法分析的任务就是分析文法结构以及判定输入的字符串是否能够被文法识别。语法分析可以是自顶向下(Top-down)语法分析,也可以是自底向上(Bottom-up)语法分析。

 

语法分析程序被称为Syntax Analyzer。通常也叫Parser。

 

语法分析根据语言文法规则构造语法分析树(Parsing tree)。

 

翻译单元

翻译单元(translation unit,compilation unit)在C语言中,翻译单元定义为:

1、一个.c(通常)的源程序文件可以认为是一个翻译单元。

在C语言中,在一个.c(通常)的源程序文件内定义的变量是不能在外面其他.c(通常)的源程序文件中引用,除非通过extern将这个变量声明为可全局访问的变量。

2、语句块可以认为是一个翻译单元。

在语句块内定义的变量是不能在语句块外面引用。

 

在C语言标准中,称之为“translation unit”。

 

 

语法分析单元

计算机编程语言发展这么多年,虽然出现了各种各样的编程语言。从编程语言范畴来看,有面向过程编程语言,面向对象编程语言,函数式编程语言等,各种语言范畴之间会相差比较大,不过同一

种类型语言之间语法都大同小异。

 

在所有编程语言中,C语言是最简单的一种编程语言,语法简单。即使语法已经相当简单,但其文法规则也相当复杂。C语言针对语句、表达式、类型定义、函数定义、函数声明、变量定义、变量声

明有一整套语法规则,或者说文法规则。

 

在C语言中,一条语句后面跟一个分号(;)作为这条语句的结束。包括类型定义、函数声明、变量声明,后面都一个分号(;)作为结束。例外的情况是,复合语句、语句块通过大括号括起来的

多条语句,这些在语句块后面不会一个分号(;)作为复合语句、语句块的结束,外面括起来的大括号本身作为复合语句、语句块的开始和结束。

 

对于输入的待解析字符串,应该怎样选择一个文法规则来进行进一步的语法分析。

 

 

 

复合语句

{

  ...

}

复合语句就是语句块

 

if (i) 

{

  ... 

}

 

switch (i)

{

  ...

}

 

while (i)

{

  ...

}

 

for ( ; ; )

{

  ...

}

 

void func()

{

  ...

}

 

在定义语言文法规则时,是否可以考虑不将这种作为结束符号的分号(;)加入语言文法规则中。

 

表达式

 

 

 

 

运算

表示法

中缀表达式(Infix Notation)

前缀表达式(Prefix Notation)

后缀表达式(Postfix Notation或Polish Notation)

 

大多数编程语言都是采用的是中缀表达式。包括C语言。

a + 1 * n

 

运算符

最常见的就是数学领域中的加、减、乘、除运算符号。数学领域中定义了大量的数学符号,编程语言中通常只定义一些比较常用的运算符,比如还有取余、与、或、异或、左移、右移、逻辑右移等

,有时候也称操作符。

 

操作符在编程语言中还有一个叫法,被称为运算子或操作子(operator),它们都表示同一个概念。

 

操作符

 

N-元操作符

也称做N-目操作符

主要就是一元操作符、二元操作符、三元操作符。超过三元的操作符很少,四元操作符基本没见过。

 

语句

 

函数调用

 

定义

 

声明

 

文法

文法结构

可以通过文法分析数或者文法分析表

 

文件包含文法

 

INCLUDE ::= '#' 'include' INCLUDE_FILE

INCLUDE_FILE ::= ANGLE_BRACKETS_INCLUDE_FILE | DOUBLE_QUOTES_INCLUDE_FILE

ANGLE_BRACKETS_INCLUDE_FILE ::= '<' IDENTIFIER '>'

DOUBLE_QUOTES_INCLUDE_FILE ::= '"' IDENTIFIER '"'

 

文件包含文法分析树

 

                     (INCLUDE)

                     /    |    \

               ('#') ('include') (INCLUDE_FILE)

                                       |

                         (ANGLE_BRACKETS_INCLUDE_FILE)

                            /          |         \

                         ('<')   (IDENTIFIER)   ('>')

 

 

                     (INCLUDE)

                     /    |    \

               ('#') ('include') (INCLUDE_FILE)

                                       |

                         (DOUBLE_QUOTES_INCLUDE_FILE)

                            /          |         \

                         ('"')   (IDENTIFIER)   ('"')

 

文件包含文法分析表

————————————————————————————+———+—————————+———+———+———

                            | # | include | < | > | " 

————————————————————————————+———+—————————+———+———+———

INCLUDE                     | Y |         |   |   |

————————————————————————————+———+—————————+———+———+———

INCLUDE_FILE                |   |         | Y |   | Y

————————————————————————————+———+—————————+———+———+———

ANGLE_BRACKETS_INCLUDE_FILE |   |         | Y |   |

————————————————————————————+———+—————————+———+———+———

DOUBLE_QUOTES_INCLUDE_FILE  |   |         |   |   | Y

————————————————————————————+———+—————————+———+———+———

 

逗号表达式文法

COMMA_EXPRESSION ::= EXPRESSION COMMA_EXPRESSION_TAIL

COMMA_EXPRESSION_TAIL ::= NULL | , COMMA_EXPRESSION

逗号表达式文法分析树

                             (COMMA_EXPRESSION)

                                 /          \

                         (EXPRESSION)    (COMMA_EXPRESSION_TAIL)

                                                    |

                                                  (NULL)

 

                             (COMMA_EXPRESSION)<————————————————+

                                 /          \                     |

                         (EXPRESSION)    (COMMA_EXPRESSION_TAIL)  |

                                               /         \        |

                                          (',')          +————————+

 

逗号表达式文法分析表

——————————————————————+—————————————+———+——————

                      | EXPRESSION  | , | NULL 

——————————————————————+—————————————+———+——————

COMMA_EXPRESSION      | Y           |   |      

——————————————————————+—————————————+———+——————

COMMA_EXPRESSION_TAIL |             | Y | Y    

——————————————————————+—————————————+———+——————

 

括号(parenthesis)表达式

PARENTHESIS_EXPRESSION ::= ( COMMA_EXPRESSION )

 

 

                          (PARENTHESIS_EXPRESSION)

                           /          |           \

                     ('(')   (COMMA_EXPRESSION)  (')')

                                 /          \

                         (EXPRESSION)    (COMMA_EXPRESSION_TAIL)

                                                    |

                                                  (NULL)

 

 

                          (PARENTHESIS_EXPRESSION)

                           /          |           \

                      ('(')           |            (')')

                             (COMMA_EXPRESSION)<————————————————+

                                 /          \                     |

                         (EXPRESSION)    (COMMA_EXPRESSION_TAIL)  |

                                               /         \        |

                                          (',')          +————————+

 

语法分析

 

自顶向下(Top-down)语法分析

自顶向下(Top-down)语法分析是对输入的字符串进行最左(leftmost)推导,从根开始构造语法分析树(Parsing tree),按照先序的方式构造语法分析树(Parsing tree)的节点。

 

自顶向下(Top-down)语法分析技术

递归下降语法分析(recursive-descent parsing)。

 

我觉得翻译成递归向下(或者向下递归)语法分析更容易让人理解。

对输入的字符串进行最左(leftmost)推导,依次从根开始构造语法分析树(Parsing tree),按照先序的方式梯归构造语法分析树(Parsing tree)的节点,如果无法继续递归构造下去,也就是

无法继续推导,则回溯上一个节点选择下一个规则继续进行推倒,直到推倒完成,如果所有可选择规则都无法继续推导,会依次回溯到根节点,也就是无法对输入的字符串进行推导,则推导失败,

这其实应该报语法错误。

 

采用这种语法分析技术也成为递归下降分析法或者递归子程序法。这样的语法分析器也叫做递归下降解析器或递归下降语法分析器。

 

LL(1)语法分析

SEE LL(1)

 

自底向上(Bottom-up)语法分析

 

语法分析树

语法分析树(Parsing tree)

 

AST

抽象语法树

 

赋值

i = i + 1

                        Assignment_statement

           /     |     \

                     Identifier   =   Expression

         /           /   |   \

i     Expression + Expression

                                   |            |

                               Identifier    Constant

                                   |            |

  i            1

 

函数调用

sum(1, 2)

要调用的函数名后面跟一个parenthesized的表达式,表达式内列出传入的参数列表。

 

                            Call_statement

           /     |     \

                     Identifier   =   Expression

         /               |    

sum    Parenthesized_Expression

                              /     |     |     |     \

                  Left_Parenthesis  |   Comma   |  Right_Parenthesis

                         |     Expression | Expression     |

                         (         |      ,     |          )

Constant     Constant

                                   |            |

                                   1            2

 

i = sum(1, 2)

 

              Assignment_statement

                   /    |     \

           Identifier   =   Call_Expression

               |            /     |     \

               i     Identifier   =   Expression

         /               |    

sum    Parenthesized_Expression

                              /     |     |     |     \

                  Left_Parenthesis  |   Comma   |  Right_Parenthesis

                         |     Expression | Expression     |

                         (         |      ,     |          )

Constant     Constant

                                   |            |

                                   1            2

 

if (i) 

  i = i + 1

 

                   

                                  If_Statement

                                   /        \

             Conditional_Expression          Assignment_statement

       |                        /     |     \

            Parenthesized_Expression        Identifier = Expression

                /       |      \                |           /   |   \

  Left_Parenthesis Expression Right_Parenthesis i    Expression + Expression

         |              |             |                  |            |

         (         Identifier         )              Identifier    Constant

                        |                                |            |

                        i                                i            1

 

 

定义

 

struct option

{

  char *name;

  int argc;

 

  char *value;

  char *default_value;

};

 

                           Struct_Definition

                          /    |       |    \

                    Struct Identifier  |     Semicolon

                      |        |       |         |

                    struct   option    |         ;

                                  Struct_Body

                                 /     |     \

                       Left_Brace      |      Right_Brace 

                           |           |           |

                           {           |           }

                                  Member_List

                                /   |     |   \

                         Member  Member Member  Member

                        / |  | \   ..     ..      ..

         Char_Type Asterisk Identifier Semicolon

             |         |         |         |

            char       *        name       ;

 

 

 

 

 

 

语法分析器

bison

https://www.gnu.org/software/bison

 

C语言编译器

通过文法规则来定义或约定C语言的优先级(precedence)、关联性(associativity)、分组(grouping)、序列点(sequence points)、协议点(agreement points)、求值顺序(order of evaluation),和相互交错(interleaving),以及lvalue和rvalue的判定是挺困难的,尤其是lvalue的判定。目前还没有一个好的方法,后续还得继续研究。

 

分享到:
评论

相关推荐

    Design Compiler各版本User Guide

    Design Compiler是业界广泛使用的电子设计自动化(EDA)工具,由Synopsys公司开发,主要用于综合集成电路(IC)设计。综合是将高层次的硬件描述语言(HDL),如Verilog或VHDL编写的代码转换为门级网表的过程。这个...

    commons-compiler-3.1.2-API文档-中文版.zip

    赠送jar包:commons-compiler-3.1.2.jar; 赠送原API文档:commons-compiler-3.1.2-javadoc.jar; 赠送源代码:commons-compiler-3.1.2-sources.jar; 赠送Maven依赖信息文件:commons-compiler-3.1.2.pom; 包含...

    Power Compiler各版本User Guide

    《Power Compiler各版本User Guide》是一系列针对不同版本Power Compiler软件的用户指南,由Synopsys公司发布。Synopsys PowerCompiler是一套高级集成电路设计解决方案,它提供了一套完整的RTL编译器设计流程,覆盖...

    Design Compiler使用指南.pdf

    Design Compiler是一款由Synopsys公司开发的业界标准的逻辑综合工具,它能够将设计描述文件和设计约束文件综合成优化后的门级电路。逻辑综合主要分为三个阶段:转换、映射和优化。转换阶段是将硬件描述语言(HDL)...

    commons-compiler-3.0.8-API文档-中文版.zip

    赠送jar包:commons-compiler-3.0.8.jar; 赠送原API文档:commons-compiler-3.0.8-javadoc.jar; 赠送源代码:commons-compiler-3.0.8-sources.jar; 赠送Maven依赖信息文件:commons-compiler-3.0.8.pom; 包含...

    fusion compiler user guide

    Synopsys EDA工具Fusion Compiler用户指南是指导用户如何使用Synopsys公司提供的Fusion Compiler集成电子设计自动化(EDA)软件的官方手册。该指南详细介绍了软件的使用方法、操作流程以及相关的技术数据和限制条件。 ...

    pg149-fir-compiler_Help!_vivadofircompiler_compiler_

    标题中的“pg149-fir-compiler_Help!_vivadofircompiler_compiler_”暗示了这是一个关于Vivado FIR(Finite Impulse Response)滤波器编译器的问题,用户可能在使用过程中遇到了困难,急需帮助。描述中提到的“help ...

    commons-compiler-3.1.4-API文档-中文版.zip

    赠送jar包:commons-compiler-3.1.4.jar; 赠送原API文档:commons-compiler-3.1.4-javadoc.jar; 赠送源代码:commons-compiler-3.1.4-sources.jar; 赠送Maven依赖信息文件:commons-compiler-3.1.4.pom; 包含...

    scala-compiler-2.11.8-API文档-中英对照版.zip

    赠送jar包:scala-compiler-2.11.8.jar; 赠送原API文档:scala-compiler-2.11.8-javadoc.jar; 赠送源代码:scala-compiler-2.11.8-sources.jar; 赠送Maven依赖信息文件:scala-compiler-2.11.8.pom; 包含翻译后...

    ARM Compiler 5 Version 5.6u7

    《ARM Compiler 5 Version 5.6u7与keil5 V5编译器详解》 在嵌入式系统开发领域,编译器扮演着至关重要的角色,它们将程序员编写的高级语言转换为处理器可执行的机器代码。本文将深入探讨 ARM Compiler 5 Version ...

    ARM compiler version 5

    ARM Compiler Version 5是ARM公司推出的一款针对嵌入式系统开发的编译工具链,它在Keil MDK(Microcontroller Development Kit)中扮演着重要角色。Keil MDK是广泛使用的ARM微控制器开发环境,集成了编译器、调试器...

    Keil.ARM-Compiler.1.7.2.pack; 解压密码:1234; Keil.ARM-Compiler.1.7.2

    在深入分析Keil.ARM_Compiler.1.7.2这个压缩包之前,首先需要了解Keil软件以及ARM Compiler的基本概念。Keil是一款广泛使用的嵌入式软件开发工具,特别适用于ARM处理器的编程和开发。ARM Compiler是Keil软件中的一个...

    将Excel转换成Exe之DoneEx XCell Compiler

    DoneEx XCell Compiler 使用指南 DoneEx XCell Compiler 是一款功能强大的Excel转换器,可以将Excel文件转换成可执行文件(EXE),保护VBA代码的安全性。本文将对 DoneEx XCell Compiler 的使用方法进行详细介绍。...

    closure-compiler-v20171112.jar

    Closure Compiler是Google开发的一款强大的JavaScript代码优化工具,其主要功能是对JavaScript代码进行压缩和混淆,以提高代码的运行效率和安全性。"closure-compiler-v20171112.jar"是该编译器的一个特定版本,发布...

    ARM Compiler v5.05, Build 169 for Windows

    ARM Compiler v5.05, Build 169, is intended for use as an update for ARM Compiler 5 products, and must be used with a suitable license from one of these products. This update is not suitable for ...

    JavaCompiler --JDK6 API的简介(java动态编译)

    JavaCompiler --JDK6 API 的简介(java动态编译) JavaCompiler 是 Java 中的一个编译器接口,提供了编译 Java 源代码的功能。在 Java SE6 中,JavaCompiler 接口是 javax.tools 包的一部分,提供了标准的方式来...

    plexus-compiler--2.8.4.jar.rar

    这个压缩包文件"plexus-compiler--2.8.4.jar.rar"包含了Plexus Compiler的三个关键模块,分别是plexus-compiler-api-2.8.4.jar、plexus-compiler-javac-2.8.4.jar和plexus-compiler-manager-2.8.4.jar,这些文件版本...

    Avocet_C_compiler_Motorla_68HC11_CCompiler_M68HC11_Avocet_Wideui

    《Avocet_C_compiler_Motorla_68HC11:深入理解Ansi C编译器与Motorola 68HC11微控制器》 在嵌入式系统领域,编程语言的选择至关重要,其中C语言因其高效、灵活和可移植性而广受欢迎。Avocet C Compiler是一款针对...

    Arm Compiler 5.06-ARM编译器

    Arm Compiler 5.06是由ARM公司开发的一款C/C++编译器,它是针对ARM架构处理器的专业编译工具,被广泛应用于嵌入式系统的开发中。该编译器在Keil MDK-ARM软件开发工具套件(MDK)的特定版本中是独立的组件。对于使用...

    pg141-dds-compiler_Xilinx_pg141-dds_pg141-dds-compiler_

    标题中的“pg141-dds-compiler_Xilinx_pg141-dds_pg141-dds-compiler_”暗示了这是一个与Xilinx公司的DDS(Direct Digital Synthesis,直接数字频率合成)编译器相关的资源,版本号可能是14.1。DDS是一种广泛应用于...

Global site tag (gtag.js) - Google Analytics