SNL文法

这学期学编译原理,课程设计是为SNL文法实现一个词法分析器,和递归下降法或LL(1)分析法实现的语法分析器


总程序:

1)Program::=ProgramHead DeclarePart ProgranBody .

2)ProgramHead::=program  ProgranName

3)ProgranName::=ID

4)DeclarePart::=TypeDecpart VarDecpart ProcDecpart

5)TypeDecpart::=ε

6)               | TypeDec

7)TypeDec::=type TypeDecList

8)TypeDecList::=TypeId= TypeName; TypeDecMore

9)   TypeDecMore::= ε

10)          | TypeDecList

11)TypeId::=ID

12)TypeName::=BaseName

13)           | StructureType

14)           | ID

15)BaseName::=integer

16)           | char

17)StructureType::=ArrayType

18)             | RecType

19)ArrayType::=array[low..top] of  BaseName

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::=IDIdMore

28)IdMore::=ε

29)         |,IdList

 

变量声明

30)VarDecpart::= ε

31)             |VarDec

32)VarDec::=varVarDecList

33)VarDecList::=TypeNameVarIdList; VarDecMore

34)VarDecMore::=ε

35)               | VarDecList

36)VarIdList::=id VarIdMore

37)VarIdMore::= ε

38)             | ,VarIdList

 过程声明

39)ProcDecpart::= ε

40)             | ProcDec

41)ProcDec::=procedure

 ProcName(ParamList);

 ProcDecPart

 ProcBody

 ProcDecMore

42)ProcDecMore::= ε

43)              | ProcDec

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::=IDFidMore

53)FidMore::= ε

54)          |, FormList

过程中的声明

55)ProcDecPart::=DeclarePart

过程体

56)ProcBody::=ProgramBody

57)ProgramBody::=begin StmList  end.

语句序列

58)StmList::=StmStmMore

59)StmMore::= ε

60)          |; StmList

 

语句

61)StmList::=ConditionalStm

62)         | LoopStm

63)         | InputStm

64)         | OutputStm

65)         | ReturnStm

66)         | ID AssCall

67)AssCall::=AssignmentRest

68)         | CallStmRest

69)AssignmentRest::=VariMore:=Exp

70)ConditionalStm::=ifRelExp then StmList else StmList fi

71)LoopStm::=whileRelExp 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::=ExpOtherRelE

82)OtherRelE::=CmpOpExp

83)Exp::=TermOtherTerm

84)OtherTerm::= ε

85)            |AddOp Exp

86)Term::=Factor OtherFactor

87)OtherFactor::= ε

88)            |MulOp  Term

89)Factor::=(Exp)

90)       | INTC

91)       | Variable

92)Variable::=IDVariMore

93)VariMore::= ε

94)          |[Exp]

95)          |.FieldVar

96)FieldVar::=ID FieldVarMore

97)FieldVarMore::= ε

98)             |[Exp]

99)CmpOp::=<

100)                  | =

101)          AddOp::=+

102)                  |-

103)          MultOp::=*

104)                   |/



例子程序:

program bubble

var integer i,j,num;

array[1..20] of integer a;

procedure q(integernum);

var integer i,j,k;

   integert;

   begin

   i:=1;

   j:=1;

   while i<num do

         j:=num-i+1;

         k:=1;

         while k<j do

                if a[k+1]<a[k] thent:=a[k]; a[k]:=a[k+1]; a[k+1]:=t

               else  temp:=0

               fi;

               k:=k+1

         endwh;

   i:=i+1

   endwh

end

begin

    read(num);

    i:=1;

    while i<(num+1) do

         read(j);

          a[i]:=j;

         i:=i+1

    endwh;

   q(num);

    i:=1;

    while i<(num+1) do

          write(a[i]);

          a[i]:=j;

          i:=i+1

    endwh

end .


递归下降分析法 一、实验目的: 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。 二、实验说明 1、递归下降分析法的功能 词法分析器的功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。 2、递归下降分析法的前提 改造文法:消除二义性、消除左递归、提取左因子,判断是否为LL(1)文法, 3、递归下降分析法实验设计思想及算法 为G的每个非终结符号U构造一个递归过程,不妨命名为U。 U的产生式的右边指出这个过程的代码结构: (1)若是终结符号,则和向前看符号对照, 若匹配则向前进一个符号;否则出错。 (2)若是非终结符号,则调用与此非终结符对应的过程。当A的右部有多个产生式时,可用选择结构实现。 三、实验要求 (一)准备: 1.阅读课本有关章节, 2.考虑好设计方案; 3.设计出模块结构、测试数据,初步编制好程序。 (二)上课上机: 将源代码拷贝到机上调试,发现错误,再修改完善。第二次上机调试通过。 (三)程序要求: 程序输入/输出示例: 对下列文法,用递归下降分析法对任意输入的符号串进行分析: (1)E->eBaA (2)A->a|bAcB (3)B->dEd|aC (4)C->e|dc 输出的格式如下: (1)递归下降分析程序,编制人:姓名,学号,班级 (2)输入一以#结束的符号串:在此位置输入符号串例如:eadeaa# (3)输出结果:eadeaa#为合法符号串 注意: 1.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好); 2.对学有余力的同学,可以详细的输出推导的过程,即详细列出每一步使用的产生式。 (四)程序思路 0.定义部分:定义常量、变量、数据结构。 1.初始化:从文件将输入符号串输入到字符缓冲区中。 2.利用递归下降分析法分析,对每个非终结符编写函数,在主函数中调用文法开始符号的函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值