SNL编译器开发

 最近编译原理实验课,要求我们做一个SNL语言的语法词法分析器,用时四周。接下来几周我将记录每天的工作。

  第一天就简要介绍下SNL的语言吧(简单的具有嵌套过程的程序设计语言),Small NestedLanguage(SNL)即简单的具有嵌套过程的程序设计语言,是一种教学用的过程式语言,最初由《编译程序的设计与实现》一书的作者设计并实现了其编译程序(SNLC)。该语言具有标准数据类型和结构数据类型,可以嵌套定义过程,允许递归调用,过程的参数可以分为值参和变参两种形式,控制语句和Pascal语言基本相同,除指针类型外,SNL具备了过程式语言的基本特征。SNL是自行定义的,很大程度上是一种类Pascal的“高级”程序设计语言。用其作为实例语言并构造编译程序,可以使绝大多数编译技术在编写元级程序的过程中得到体现。(摘自百度百科)

  SNL语言的单词分类:

  

 标识符                  ( ID ) 
 保留字                  (它是标识符的子集, if,repeat,read,write,…)
 无符号整数              ( INTC )
 单字符分界符          ( + , - , * , / , < ,= ,( , ) , [ , ] , . , ; , EOF ,空白字符 )
 双字符分界符          ( := )
 注释头符              ( { )
 注释结束符            ( } )
 字符起始和结束符    ( ‘ )
 数组下标界限符        ( .. )        

 

符号的巴克斯范式定义:

< 标识符 >              ::=   字母 { 字母 | 数字 }
< 无符号整数 >          ::=   数字 { 数字 }
< 单字符分界符 >  ::=   + | - | *| / | ( | ) | [ | ] | ; | . | < | = | EOF | 空白字符 
< 双字符分界符 >   ::=   : =
< 注释头符号 >          ::=   {
< 注释结束符号 >  ::=   }
< 字符标示符 >       ::=< 数组下标界限符 >   ::=   ..
<字母>                  ::=   a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | 
u | v | w | x | y |z | A| B | C | D | E | F | G | H | I | J | K | L | 
M | N | O | P | Q | R | S | T | U |V | W | X| Y | Z
<数字>                 ::=   0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

SNL语言的上下文无关的文法:

1)     Program    ::=    ProgramHead  DeclarePart ProgramBody
2)     ProgramHead    ::=    PROGRAM    ProgramName
3)     ProgramName      ::=       ID
4)     DeclarePart    ::=    TypeDec  VarDec  ProcDec
5)     TypeDec        ::=6)                    | TypeDeclaration        
7)     TypeDeclaration::=     TYPE    TypeDecList        
8)     TypeDecList    ::=    TypeId = TypeName ; TypeDecMore
9)     TypeDecMore    ::=10)                             | TypeDecList                
11)    TypeId        ::=     ID    
12)   TypeName    ::=     BaseType
13)                                   | StructureType 
14)                | ID        
15)    BaseType    ::=    INTEGER
16)                         | CHAR
17)   StructureType    ::=     ArrayType
18)                             | RecType                        
19)    ArrayType    ::=    ARRAY [low..top ] OF BaseType
20)    Low              ::=      INTC
21)   Top                 ::=    INTC   
22)   RecType        ::=    RECORD  FieldDecList     END
23)   FieldDecList    ::=    BaseType  IdList ; FieldDecMore    
24)                               | ArrayType IdList ; FieldDecMore
25)   FieldDecMore    ::=26)                | FieldDecList
27)    IdList        ::=     ID  IdMore                
28)    IdMore        ::=29)                    | , IdList  
30)    VarDec        ::=31)                             | VarDeclaration            
32)    VarDeclaration    ::=    VAR  VarDecList            
33)    VarDecList    ::=    TypeName    VarIdList ;  VarDecMore
34)    VarDecMore    ::=35)                           |VarDecList
36) VarIdList    ::=    id  VarIdMore    
37) VarIdMore    ::=38)                            | , VarIdList                    
39)    ProcDec    ::=40)                            | ProcDeclaration              
41)   ProcDeclaration::=    PROCEDURE        
                    ProcName ( ParamList )  ;
                    ProcDecPart
                    ProcBody
                    ProcDecMore 
42)   ProcDecMore::=43)                | ProcDeclaration    
44)   ProcName     ::=    ID    
45)   ParamList    ::=46)                             | ParamDecList     
47)   ParamDecList    ::=     Param  ParamMore
48)   ParamMore    ::=49)                | ; ParamDecList            
50)    Param        ::=    TypeName  FormList
51)                                | VAR TypeName  FormList    
52)    FormList    ::=     ID  FidMore        
53)    FidMore    ::=54)                                | , FormList    
55)    ProcDecPart    ::=    DeclarePart   

56)    ProcBody        ::=    ProgramBody    

57)   ProgramBody    ::=    BEGIN  StmList END

58)    StmList        ::=    Stm        StmMore    
59)    StmMore        ::=60)                     | ;  StmList    
61)   Stm        ::=    ConditionalStm
62)                    | LoopStm            
63)                    | InputStm    
64)                    |OutputStm        
65)                    | ReturnStm        
66)                    | ID AssCall     
67)    AssCall    ::=      AssignmentRest        
68)                                | CallStmRest            
69)    AssignmentRest    ::= VariMore    := Exp    
70)    ConditionalStm    ::=    IF RelExp THEN                     
                                         StmList ELSE StmList  FI
71)   LoopStm::=    WHILE  RelExp DO StmList                
                                ENDWH                
72)   InputStm    ::=    READ ( Invar)     
73)   Invar         ::=   ID            
74)   OutputStm    ::=    WRITE( Exp )
75)   ReturnStm    ::=    RETURN ( Exp )        
76)   CallStmRest    ::=    ( ActParamList )    
77)   ActParamList::=78)                            | Exp  ActParamMore
79)   ActParamMore::=80)                             | ,  ActParamList    
81)   RelExp    ::=  Exp  OtherRelE
82)   OtherRelE    ::=  CmpOp   Exp         
83)   Exp        ::=  Term   OtherTerm
84)   OtherTerm    ::=85)                                   | AddOp   Exp
86)   Term        ::=   Factor   OtherFactor
87)   OtherFactor    ::=88)                                |  MultOp  Term
89)   Factor        ::=   (  Exp  )
90)                                 |  INTC    
91)                                 |  Variable
92)    Variable    ::=   ID   VariMore
93)   VariMore    ::=94)                              | [ Exp ]    
95)                              | .  FieldVar
96)   FieldVar    ::=      ID   FieldVarMore    
97)   FieldVarMore::=98)                             | [ Exp  ]                
99)   CmpOp    ::=      <
100)                             |  =    
101)  AddOp    ::=      +    
102)                         | -
103)  MultOp    ::=      *
104)                         |  /    
        

第一天没有什么实质性的成果,只是看看书熟悉一下正则表达式,NFS,DFS。

 

 

 

 

 

转载于:https://www.cnblogs.com/JerryWagn/p/6765192.html

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SNL(System Network Language)编译器程序是为了编译SNL语言设计的软件包,用于将SNL语言的源代码转化为计算机可执行的机器代码。SNL语言是一种面向过程的高级程序设计语言,主要用于网络系统和通信领域。 SNL编译器程序包C是指使用C语言编写的SNL编译器程序包。C语言是一种广泛应用的高级编程语言,具有强大的编程能力和高效的运行效率。通过使用C语言编写SNL编译器,可以充分利用C语言的优势,使得编译器程序更加稳定、可靠,并且具备良好的可移植性。 SNL编译器程序包C的主要功能包括词法分析语法分析、语义分析、中间代码生成、目标代码生成等。它通过识别SNL语言中的关键词、标识符、运算符等,进行语法分析,检查语法的正确性,并进行语义分析,对程序进行语义检查和类型匹配等操作。在这个过程中,编译器会生成中间代码,这是一种中间形式的代码,方便后续的优化和转换。最后,编译器会将中间代码转化为目标机器代码,并生成可执行的程序。 通过使用SNL编译器程序包C,开发人员可以简化SNL语言程序的开发过程,提高开发效率,减少错误的产生。同时,编译器可以进行一些优化操作,对生成的中间代码和目标代码进行优化,使得程序更加高效。编译器程序包C的运行环境依赖于C语言编译器和运行时环境,在使用前需要先安装和配置相应的软件环境。 总之,SNL编译器程序包C是一个用C语言编写的编译器程序,用于将SNL语言源代码转化为机器代码,提供了丰富的功能和优化选项,可以提高SNL程序的开发效率和执行效率。 ### 回答2: SNL编译器程序包C是一种用于编译SNL(Simplified Network Language,简化网络语言)的编译器工具。SNL是一种高级网络编程语言,广泛应用于网络通信和网络应用开发中。 SNL编译器程序包C主要包含了针对SNL语言编译器前端和后端的各种功能模块编译器前端主要负责词法分析语法分析和语义分析等任务,将SNL源代码转化为中间代码表示。编译器后端则负责中间代码的优化和目标代码的生成。 SNL编译器程序包C的设计目标是提供一个高效且可靠的编译器工具,方便开发人员编译和调试SNL程序。通过使用该工具,开发人员可以将SNL代码转化为可执行的目标代码,从而在各种平台上运行和部署SNL应用程序。 SNL编译器程序包C还提供了一些辅助工具和库函数,帮助开发人员更加便捷地进行SNL程序的开发。其中包括调试工具、运行时库等。开发人员可以利用这些工具和函数库来优化程序的性能,检测和排除程序中的错误。 总而言之,SNL编译器程序包C是一款专门为SNL语言设计编译器工具,通过它可以将SNL代码转化为可执行的目标代码,方便开发人员进行SNL程序的编译和调试。它的使用可以提高开发效率,减少错误,并且为SNL程序的执行提供了良好的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值