Tiny语言编译器:Tiny语法分析器模块

编译器的词法分析模块完成后就要进行语法分析模块的设计,实验的环境还是和上次词法分析模块的一样,在其基础上增加了语法分析的功能。
 

 

 

ContractedBlock.gifExpandedBlockStart.gifView Code
 
   
1 本次实验用的是自顶向下的方法来分析语法。
  2 本次实验所使用到的数据结构如下:
3 节点类型:
4 typedef enum {StmtK ,ExpK }NodeKind;
5 语句类型:
6 typedef enum { IfK,RepeatK,AssignK,ReadK,WriteK,WhileK,DeclareK }StmtKind;
7 相对于书中的例子多以一个DeclareK类型的语句。
8 表达式种类:
9 typedef enum {OpK,ConstK,IdK,StringK}ExpKind;
10 用于类型检查的表打式类型:
11 typedef enum {Void ,Integer,Boolean ,Strings}ExpType;
12 节点:
13 typedef struct treeNode
14 {
15 struct treeNode * child[MAXCHILDREN];
16 struct treeNode * sibling;
17 int lineno;
18 NodeKind nodekind;
19 union
20 {
21 StmtKind stmt;
22 ExpKind exp;
23 } kind;
24 union
25 {
26 TokenTypes op;
27 int val;
28 char * name;
29 } attr;
30 ExpType type;
31 }TreeNode;
32 进行语法分析所需要的语法分析的文法已经相对应的函数说明如下:
33
34 处理文法 declarations-> decl ; declarations |ε:
35 static TreeNode * declarations(void);
36 处理文法 decl -> type-specifier varlist:
37 static TreeNode * decl(void);
38 处理文法 type-specifier -> int | bool | char
39 varlist -> identifier { , identifier }
40 static TreeNode * varlist(ExpType type);
41
42 处理文法 stmt-sequence -> statement { ; statement }
43 static TreeNode * stmt_sequence(void);
44 处理文法 statement -> if-stmt | repeat-stmt | assign-stmt | read-stmt | write-stmt | while-stmt
45 static TreeNode * statement(void);
46 处理文法 if-stmt -> if bool-exp then stmt-sequence [else stmt-sequence] end
47 static TreeNode * if_stmt(void);
48 处理文法 10 repeat-stmt -> repeat stmt-sequence until bool-exp
49 static TreeNode * repeat_stmt(void);
50 处理文法 11 assign-stmt -> identifier:=exp
51 static TreeNode * assign_stmt(void);
52 处理文法 12 read-stmt -> read identifier
53 static TreeNode * read_stmt(void);
54 处理文法 13write-stmt -> write exp
55 static TreeNode * write_stmt(void);
56 处理文法 8while-stmt -> while bool-exp do stmt-sequence end
57 static TreeNode * while_stmt(void);
58 处理文法 14 exp -> arithmetic-exp | bool-exp | string-exp
59 static TreeNode * exp(void);
60 处理文法 15 arithmetic-exp -> term { addop term }
61 static TreeNode * arithmetic_exp(void);
62 处理文法 20 bool-exp -> bterm { or bterm }
63 static TreeNode * bool_exp(void);
64 处理文法 21 bterm -> bfactor { and bfactor}
65 static TreeNode * bterm(void);
66 处理文法 22 bfactor ->not bfactor| true |false| comparison-exp
67 static TreeNode * bfactor(void);
68 处理文法 23 comparison-exp -> arithmetic-exp comparison-op
69 arithmetic-exp
70 static TreeNode * comparison_exp(void);
71 处理文法 25string-exp-> string
72 static TreeNode * string_exp(void);
73 处理文法 17 term -> factor { mulop factor }
74 static TreeNode * term(void);
75 处理文法 19 factor -> (arithmetic-exp) | number | identifier
76 static TreeNode * factor(void);

 

在写语法分析模块遇到比较困难的问题是:
一是declarations-> decl ; declarations |ε:文法产生的树节点的安排问题,我们是采用了相同类型的声明串用兄弟节点的身份串起来,例如:String a ,b, c;和声明串 int d ,e f ;所在的子树是兄弟节点的关系。然后声明串的内部 a, b,c又分别是兄弟节点,最总这三个节点由一个节点挂到刚才上面说所的声明串的孩子节点下。
二是,之前文法出现了点左公因子的问题,目前该程序由于时间问题,我们暂时不对其做处理,之前想过一些文法来处理,但总归是比理想,希望能在下次试验解决这个问题。

2010-12-23 09:56:22

转载于:https://www.cnblogs.com/wpdev/archive/2010/12/23/1964859.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值