最近编译原理实验课,要求我们做一个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。