经过三个小时的努力,一个供调试用的模拟器终于做出来了。对于一份语法说明来讲,我们需要提供调试器,一直到调试完了才生成代码,这样比较容易找到问题。同时为了验证自己的那个设计,于是做了一个调试器出来。这个调试器使用了
这篇文章里的数据结构文件以及文法文件,以及使用了
这篇文章里开发的一个树到图的转换程序,成功得到结果!
模拟器的Demo输入3个文件,依次是数据结构文件、文法分析文件以及一个被分析的字符串,内容如下:
数据结构文件:
1 enum BinopType
2 {
3 Plus
4 Minus
5 Mul
6 Div
7 }
8 enum SinopType
9 {
10 Negative
11 }
12
13 class Expression
14 {
15 }
16 class Number Expression
17 {
18 double Number
19 }
20 class Binop Expression
21 {
22 BinopType Operator
23 Expression^ LeftOp
24 Expression^ RightOp
25 }
26 class Sinop Expression
27 {
28 SinopType Operator
29 Expression^ Operand
30 }
31 class Invoke Expression
32 {
33 string Name
34 list<Expression^> Parameters
35 }
文法分析文件:
1 num="\d+(.\d+)?" ;
2 ident="[a-zA-Z_]\w*" ;
3 plus="\+" ;
4 minus="\-" ;
5 mul="\*" ;
6 div="/" ;
7 leftbrace="\(" ;
8 rightbrace="\)" ;
9 comma="," ;
10 discard="\s+" ;
11
12 Number^ factor =num{Number} ;
13 Sinop^ factor =minus{Operator=Negative} factor{Operand} ;
14 Expression^ factor =leftbrace exp{#result} rightbrace ;
15 Invoke^ factor =ident{Name}[leftbrace param_list{Parameters} rightbrace] ;
16 Expression^ term =factor{#result} ;
17 Binop^ term =term{LeftOp} (mul{Operator=Mul}|div{Operator=Div}) factor{RightOp} ;
18 Expression^ exp =term{#result} ;
19 Binop^ exp =exp{LeftOp} (plus{Operator=Plus}|minus{Operator=Minus}) term{RightOp} ;
20 list<Expression^> param_list =exp{#insert} [comma param_list{#result}] ;
21 Expression^ program =exp{#result} ;
被分析字符串:
1 (1+sin(2))*(sin(log(2,3))+4)
分析结束以后,控制台程序打印出结果以及图片:
1 --------------------------------------------------------------------------------
2 正在分析数据结构文件
3 --------------------------------------------------------------------------------
4 enum BinopType
5 {
6 Plus
7 Minus
8 Mul
9 Div
10 }
11 enum SinopType
12 {
13 Negative
14 }
15 class Expression
16 {
17 }
18 class Number Expression
19 {
20 double Number
21 }
22 class Binop Expression
23 {
24 BinopType Operator
25 Expression^ LeftOp
26 Expression^ RightOp
27 }
28 class Sinop Expression
29 {
30 SinopType Operator
31 Expression^ Operand
32 }
33 class Invoke Expression
34 {
35 string Name
36 list<Expression^> Parameters
37 }
38 --------------------------------------------------------------------------------
39 正在分析文法定义文件
40 --------------------------------------------------------------------------------
41 lexical inferences {
42 lexical inference {
43 num
44 \d+(.\d+)?
45 }
46 lexical inference {
47 ident
48 [a-zA-Z_]\w*
49 }
50 lexical inference {
51 plus
52 \+
53 }
54 lexical inference {
55 minus
56 \-
57 }
58 lexical inference {
59 mul
60 \*
61 }
62 lexical inference {
63 div
64 /
65 }
66 lexical inference {
67 leftbrace
68 \(
69 }
70 lexical inference {
71 rightbrace
72 \)
73 }
74 lexical inference {
75 comma
76 ,
77 }
78 lexical inference {
79 discard
80 \s+
81 }
82 }
83 syntax inferences {
84 rule {
85 Number^
86 factor
87 num{Number }
88 }
89 rule {
90 Sinop^
91 factor
92 sequence {
93 minus{Operator = Negative}
94 factor{Operand }
95 }
96 }
97 rule {
98 Expression^
99 factor
100 sequence {
101 leftbrace
102 exp{#result }
103 rightbrace
104 }
105 }
106 rule {
107 Invoke^
108 factor
109 sequence {
110 ident{Name }
111 optional {
112 sequence {
113 leftbrace
114 param_list{Parameters }
115 rightbrace
116 }
117 }
118 }
119 }
120 rule {
121 Expression^
122 term
123 factor{#result }
124 }
125 rule {
126 Binop^
127 term
128 sequence {
129 term{LeftOp }
130 branch {
131 mul{Operator = Mul}
132 div{Operator = Div}
133 }
134 factor{RightOp }
135 }
136 }
137 rule {
138 Expression^
139 exp
140 term{#result }
141 }
142 rule {
143 Binop^
144 exp
145 sequence {
146 exp{LeftOp }
147 branch {
148 plus{Operator = Plus}
149 minus{Operator = Minus}
150 }
151 term{RightOp }
152 }
153 }
154 rule {
155 list<Expression^>
156 param_list
157 sequence {
158 exp{#insert }
159 optional {
160 sequence {
161 comma
162 param_list{#result }
163 }
164 }
165 }
166 }
167 rule {
168 Expression^
169 program
170 exp{#result }
171 }
172 }
173 --------------------------------------------------------------------------------
174 正在构造语法分析器
175 --------------------------------------------------------------------------------
176 --------------------------------------------------------------------------------
177 正在进行语法分析
178 --------------------------------------------------------------------------------
179 --------------------------------------------------------------------------------
180 以下是分析结果1/1
181 分析结果的图片保存在计算器表达式[0].bmp。
182 --------------------------------------------------------------------------------
183 <DATA> = {
184 LeftOp = {
185 LeftOp = {
186 Number = 1
187 }
188 Operator = Plus
189 RightOp = {
190 Name = sin
191 Parameters = {
192 <DATA> = {
193 Number = 2
194 }
195 }
196 }
197 }
198 Operator = Mul
199 RightOp = {
200 LeftOp = {
201 Name = sin
202 Parameters = {
203 <DATA> = {
204 Name = log
205 Parameters = {
206 <DATA> = {
207 Number = 2
208 }
209 <DATA> = {
210 Number = 3
211 }
212 }
213 }
214 }
215 }
216 Operator = Plus
217 RightOp = {
218 Number = 4
219 }
220 }
221 }
posted on 2008-09-14 07:22
陈梓瀚(vczh) 阅读(1830)
评论(1) 编辑 收藏 引用 所属分类:
脚本技术