-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsimple-interpreter-01.html
executable file
·359 lines (284 loc) · 30.3 KB
/
simple-interpreter-01.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<title>kizzy的个人博客 - Let’s Build A Simple Interpreter. Part 1.</title>
<meta name="description" content="">
<meta name="author" content="kizzy">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
<!--[if lt IE 9]>
<script src="https://kuikui.tech/theme/html5.js"></script>
<![endif]-->
<!-- Le styles -->
<link href="https://kuikui.tech/theme/bootstrap.min.css" rel="stylesheet">
<link href="https://kuikui.tech/theme/bootstrap.min.responsive.css" rel="stylesheet">
<link href="https://kuikui.tech/theme/local.css" rel="stylesheet">
<link href="https://kuikui.tech/theme/pygments.css" rel="stylesheet">
<!-- So Firefox can bookmark->"abo this site" -->
<link href="https://kuikui.tech/feeds/all.atom.xml" rel="alternate" title="kizzy的个人博客" type="application/atom+xml">
</head>
<body>
<div class="navbar">
<div class="navbar-inner">
<div class="container">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
<a class="brand" href="https://kuikui.tech">kizzy的个人博客</a>
<div class="nav-collapse">
<ul class="nav">
</ul>
</div>
</div>
</div>
</div>
<div class="container">
<div class="content">
<div class="row">
<div class="span9">
<div class='article'>
<div class="content-title">
<h1>Let’s Build A Simple Interpreter. Part 1.</h1>
Wed 17 June 2020
by <a class="url fn" href="https://kuikui.tech/author/kizzy.html">kizzy</a>
</div>
<div><blockquote>
<p><strong><em>“如果你不了解编译器是如何工作的,那么你应该也不会理解计算机是如何工作的。如果你不能百分百确定编译器是如何工作的,那你肯定也不知道具体的代码是如何运作的。”</em></strong> ——史蒂芬·耶格</p>
</blockquote>
<p><img alt="image" src="https://ruslanspivak.com/lsbasi-part1/lsbasi_part1_i_know.png"></p>
<p>如果你说你已经完全了解编译器和解释器的运作原理,哦,那是真的牛皮,那就别再看下去了。
我们为什么要学习解释器和编译器呢?</p>
<ol>
<li>要写一个编译器或者解释器我们需要十分深厚的技术功底,并且它也将帮助你提升这些技术的使用技巧来成为一个更为优秀的SDE(软件开发工程师)。并且,这些技巧在各个技术领域都是十分有用的。</li>
<li>当你非常迫切的想要了解计算机/编译器是如何工作的时候,自己构建一个是最好的提升方式。</li>
<li>如果你想构建自己独一无二的编程语言,一个适合的解释器/编译器是十分必要的。</li>
</ol>
<p>那么什么是解释器或者说编译器呢?</p>
<p>编译器或者解释其的目标是把高层级的编程语言翻译成另外一种形式,那么编译器和解释器的区别是什么呢? 一般来讲,编译器直接把高级语言直接翻译成机器语言而解释器并不会立刻翻译高级程序成机器代码。
<img alt="image" src="https://ruslanspivak.com/lsbasi-part1/lsbasi_part1_compiler_interpreter.png"></p>
<p>这个教程会帮助你向Pascal语言的子集构建一个简单的解释器,最后会得到一个可以运行的Pascal解释器和一个源代码级别的调试器,例如Python的pdb。</p>
<p>先贴一个简单的Pascal语言的阶乘代码,之后可以使用自己的解释器对其进行解释,并使用调试器进行调试。</p>
<div class="highlight"><pre><span></span><code><span class="nt">program</span> <span class="nt">factorial</span><span class="o">;</span>
<span class="nt">function</span> <span class="nt">factorial</span><span class="o">(</span><span class="nt">n</span><span class="o">:</span> <span class="nt">integer</span><span class="o">):</span> <span class="nt">longint</span><span class="o">;</span>
<span class="nt">begin</span>
<span class="nt">if</span> <span class="nt">n</span> <span class="o">=</span> <span class="nt">0</span> <span class="nt">then</span>
<span class="nt">factorial</span> <span class="o">:=</span> <span class="nt">1</span>
<span class="nt">else</span>
<span class="nt">factorial</span> <span class="o">:=</span> <span class="nt">n</span> <span class="o">*</span> <span class="nt">factorial</span><span class="o">(</span><span class="nt">n</span> <span class="nt">-</span> <span class="nt">1</span><span class="o">);</span>
<span class="nt">end</span><span class="o">;</span>
<span class="nt">var</span>
<span class="nt">n</span><span class="o">:</span> <span class="nt">integer</span><span class="o">;</span>
<span class="nt">begin</span>
<span class="nt">for</span> <span class="nt">n</span> <span class="o">:=</span> <span class="nt">0</span> <span class="nt">to</span> <span class="nt">16</span> <span class="nt">do</span>
<span class="nt">writeln</span><span class="o">(</span><span class="nt">n</span><span class="o">,</span> <span class="s1">'! = '</span><span class="o">,</span> <span class="nt">factorial</span><span class="o">(</span><span class="nt">n</span><span class="o">));</span>
<span class="nt">end</span><span class="o">.</span>
</code></pre></div>
<p>我们将使用pyhon来实现上述代码的解释器,当然你也可以使用其他任何语言。</p>
<p>你将开启你自己第一个计算器解释器,可以进行简单的加法计算,实现代码如下:</p>
<div class="highlight"><pre><span></span><code><span class="o">#</span> <span class="n">Token</span> <span class="n">types</span>
<span class="o">#</span>
<span class="o">#</span> <span class="n">EOF</span> <span class="p">(</span><span class="k">end</span><span class="o">-</span><span class="k">of</span><span class="o">-</span><span class="n">file</span><span class="p">)</span> <span class="n">token</span> <span class="k">is</span> <span class="n">used</span> <span class="k">to</span> <span class="n">indicate</span> <span class="n">that</span>
<span class="o">#</span> <span class="n">there</span> <span class="k">is</span> <span class="k">no</span> <span class="k">more</span> <span class="k">input</span> <span class="k">left</span> <span class="k">for</span> <span class="n">lexical</span> <span class="n">analysis</span>
<span class="nb">INTEGER</span><span class="p">,</span> <span class="n">PLUS</span><span class="p">,</span> <span class="n">EOF</span> <span class="o">=</span> <span class="s1">'INTEGER'</span><span class="p">,</span> <span class="s1">'PLUS'</span><span class="p">,</span> <span class="s1">'EOF'</span>
<span class="k">class</span> <span class="n">Token</span><span class="p">(</span><span class="k">object</span><span class="p">):</span>
<span class="n">def</span> <span class="n">__init__</span><span class="p">(</span><span class="k">self</span><span class="p">,</span> <span class="k">type</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="o">#</span> <span class="n">token</span> <span class="k">type</span><span class="p">:</span> <span class="nb">INTEGER</span><span class="p">,</span> <span class="n">PLUS</span><span class="p">,</span> <span class="k">or</span> <span class="n">EOF</span>
<span class="k">self</span><span class="p">.</span><span class="k">type</span> <span class="o">=</span> <span class="k">type</span>
<span class="o">#</span> <span class="n">token</span> <span class="n">value</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">.</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="s1">'+'</span><span class="p">,</span> <span class="k">or</span> <span class="k">None</span>
<span class="k">self</span><span class="p">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">value</span>
<span class="n">def</span> <span class="n">__str__</span><span class="p">(</span><span class="k">self</span><span class="p">):</span>
<span class="ss">"""String representation of the class instance.</span>
<span class="ss"> Examples:</span>
<span class="ss"> Token(INTEGER, 3)</span>
<span class="ss"> Token(PLUS '+')</span>
<span class="ss"> """</span>
<span class="k">return</span> <span class="s1">'Token({type}, {value})'</span><span class="p">.</span><span class="n">format</span><span class="p">(</span>
<span class="k">type</span><span class="o">=</span><span class="k">self</span><span class="p">.</span><span class="k">type</span><span class="p">,</span>
<span class="n">value</span><span class="o">=</span><span class="n">repr</span><span class="p">(</span><span class="k">self</span><span class="p">.</span><span class="n">value</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">def</span> <span class="n">__repr__</span><span class="p">(</span><span class="k">self</span><span class="p">):</span>
<span class="k">return</span> <span class="k">self</span><span class="p">.</span><span class="n">__str__</span><span class="p">()</span>
<span class="k">class</span> <span class="n">Interpreter</span><span class="p">(</span><span class="k">object</span><span class="p">):</span>
<span class="n">def</span> <span class="n">__init__</span><span class="p">(</span><span class="k">self</span><span class="p">,</span> <span class="nb">text</span><span class="p">):</span>
<span class="o">#</span> <span class="n">client</span> <span class="n">string</span> <span class="k">input</span><span class="p">,</span> <span class="n">e</span><span class="p">.</span><span class="k">g</span><span class="p">.</span> <span class="ss">"3+5"</span>
<span class="k">self</span><span class="p">.</span><span class="nb">text</span> <span class="o">=</span> <span class="nb">text</span>
<span class="o">#</span> <span class="k">self</span><span class="p">.</span><span class="n">pos</span> <span class="k">is</span> <span class="n">an</span> <span class="k">index</span> <span class="k">into</span> <span class="k">self</span><span class="p">.</span><span class="nb">text</span>
<span class="k">self</span><span class="p">.</span><span class="n">pos</span> <span class="o">=</span> <span class="mi">0</span>
<span class="o">#</span> <span class="k">current</span> <span class="n">token</span> <span class="n">instance</span>
<span class="k">self</span><span class="p">.</span><span class="n">current_token</span> <span class="o">=</span> <span class="k">None</span>
<span class="n">def</span> <span class="n">error</span><span class="p">(</span><span class="k">self</span><span class="p">):</span>
<span class="n">raise</span> <span class="k">Exception</span><span class="p">(</span><span class="s1">'Error parsing input'</span><span class="p">)</span>
<span class="n">def</span> <span class="n">get_next_token</span><span class="p">(</span><span class="k">self</span><span class="p">):</span>
<span class="ss">"""Lexical analyzer (also known as scanner or tokenizer)</span>
<span class="ss"> This method is responsible for breaking a sentence</span>
<span class="ss"> apart into tokens. One token at a time.</span>
<span class="ss"> """</span>
<span class="nb">text</span> <span class="o">=</span> <span class="k">self</span><span class="p">.</span><span class="nb">text</span>
<span class="o">#</span> <span class="k">is</span> <span class="k">self</span><span class="p">.</span><span class="n">pos</span> <span class="k">index</span> <span class="n">past</span> <span class="n">the</span> <span class="k">end</span> <span class="k">of</span> <span class="n">the</span> <span class="k">self</span><span class="p">.</span><span class="nb">text</span> <span class="o">?</span>
<span class="o">#</span> <span class="k">if</span> <span class="n">so</span><span class="p">,</span> <span class="k">then</span> <span class="k">return</span> <span class="n">EOF</span> <span class="n">token</span> <span class="n">because</span> <span class="n">there</span> <span class="k">is</span> <span class="k">no</span> <span class="k">more</span>
<span class="o">#</span> <span class="k">input</span> <span class="k">left</span> <span class="k">to</span> <span class="k">convert</span> <span class="k">into</span> <span class="n">tokens</span>
<span class="k">if</span> <span class="k">self</span><span class="p">.</span><span class="n">pos</span> <span class="o">></span> <span class="n">len</span><span class="p">(</span><span class="nb">text</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Token</span><span class="p">(</span><span class="n">EOF</span><span class="p">,</span> <span class="k">None</span><span class="p">)</span>
<span class="o">#</span> <span class="k">get</span> <span class="n">a</span> <span class="nb">character</span> <span class="k">at</span> <span class="n">the</span> <span class="k">position</span> <span class="k">self</span><span class="p">.</span><span class="n">pos</span> <span class="k">and</span> <span class="n">decide</span>
<span class="o">#</span> <span class="n">what</span> <span class="n">token</span> <span class="k">to</span> <span class="k">create</span> <span class="n">based</span> <span class="k">on</span> <span class="n">the</span> <span class="n">single</span> <span class="nb">character</span>
<span class="n">current_char</span> <span class="o">=</span> <span class="nb">text</span><span class="p">[</span><span class="k">self</span><span class="p">.</span><span class="n">pos</span><span class="p">]</span>
<span class="o">#</span> <span class="k">if</span> <span class="n">the</span> <span class="nb">character</span> <span class="k">is</span> <span class="n">a</span> <span class="n">digit</span> <span class="k">then</span> <span class="k">convert</span> <span class="n">it</span> <span class="k">to</span>
<span class="o">#</span> <span class="nb">integer</span><span class="p">,</span> <span class="k">create</span> <span class="n">an</span> <span class="nb">INTEGER</span> <span class="n">token</span><span class="p">,</span> <span class="k">increment</span> <span class="k">self</span><span class="p">.</span><span class="n">pos</span>
<span class="o">#</span> <span class="k">index</span> <span class="k">to</span> <span class="n">point</span> <span class="k">to</span> <span class="n">the</span> <span class="k">next</span> <span class="nb">character</span> <span class="k">after</span> <span class="n">the</span> <span class="n">digit</span><span class="p">,</span>
<span class="o">#</span> <span class="k">and</span> <span class="k">return</span> <span class="n">the</span> <span class="nb">INTEGER</span> <span class="n">token</span>
<span class="k">if</span> <span class="n">current_char</span><span class="p">.</span><span class="n">isdigit</span><span class="p">():</span>
<span class="n">token</span> <span class="o">=</span> <span class="n">Token</span><span class="p">(</span><span class="nb">INTEGER</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">current_char</span><span class="p">))</span>
<span class="k">self</span><span class="p">.</span><span class="n">pos</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">return</span> <span class="n">token</span>
<span class="k">if</span> <span class="n">current_char</span> <span class="o">==</span> <span class="s1">'+'</span><span class="p">:</span>
<span class="n">token</span> <span class="o">=</span> <span class="n">Token</span><span class="p">(</span><span class="n">PLUS</span><span class="p">,</span> <span class="n">current_char</span><span class="p">)</span>
<span class="k">self</span><span class="p">.</span><span class="n">pos</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">return</span> <span class="n">token</span>
<span class="k">self</span><span class="p">.</span><span class="n">error</span><span class="p">()</span>
<span class="n">def</span> <span class="n">eat</span><span class="p">(</span><span class="k">self</span><span class="p">,</span> <span class="n">token_type</span><span class="p">):</span>
<span class="o">#</span> <span class="n">compare</span> <span class="n">the</span> <span class="k">current</span> <span class="n">token</span> <span class="k">type</span> <span class="k">with</span> <span class="n">the</span> <span class="n">passed</span> <span class="n">token</span>
<span class="o">#</span> <span class="k">type</span> <span class="k">and</span> <span class="k">if</span> <span class="n">they</span> <span class="k">match</span> <span class="k">then</span> <span class="ss">"eat"</span> <span class="n">the</span> <span class="k">current</span> <span class="n">token</span>
<span class="o">#</span> <span class="k">and</span> <span class="n">assign</span> <span class="n">the</span> <span class="k">next</span> <span class="n">token</span> <span class="k">to</span> <span class="n">the</span> <span class="k">self</span><span class="p">.</span><span class="n">current_token</span><span class="p">,</span>
<span class="o">#</span> <span class="n">otherwise</span> <span class="n">raise</span> <span class="n">an</span> <span class="k">exception</span><span class="p">.</span>
<span class="k">if</span> <span class="k">self</span><span class="p">.</span><span class="n">current_token</span><span class="p">.</span><span class="k">type</span> <span class="o">==</span> <span class="n">token_type</span><span class="p">:</span>
<span class="k">self</span><span class="p">.</span><span class="n">current_token</span> <span class="o">=</span> <span class="k">self</span><span class="p">.</span><span class="n">get_next_token</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">self</span><span class="p">.</span><span class="n">error</span><span class="p">()</span>
<span class="n">def</span> <span class="n">expr</span><span class="p">(</span><span class="k">self</span><span class="p">):</span>
<span class="ss">"""expr -> INTEGER PLUS INTEGER"""</span>
<span class="o">#</span> <span class="k">set</span> <span class="k">current</span> <span class="n">token</span> <span class="k">to</span> <span class="n">the</span> <span class="k">first</span> <span class="n">token</span> <span class="n">taken</span> <span class="k">from</span> <span class="n">the</span> <span class="k">input</span>
<span class="k">self</span><span class="p">.</span><span class="n">current_token</span> <span class="o">=</span> <span class="k">self</span><span class="p">.</span><span class="n">get_next_token</span><span class="p">()</span>
<span class="o">#</span> <span class="n">we</span> <span class="n">expect</span> <span class="n">the</span> <span class="k">current</span> <span class="n">token</span> <span class="k">to</span> <span class="n">be</span> <span class="n">a</span> <span class="n">single</span><span class="o">-</span><span class="n">digit</span> <span class="nb">integer</span>
<span class="k">left</span> <span class="o">=</span> <span class="k">self</span><span class="p">.</span><span class="n">current_token</span>
<span class="k">self</span><span class="p">.</span><span class="n">eat</span><span class="p">(</span><span class="nb">INTEGER</span><span class="p">)</span>
<span class="o">#</span> <span class="n">we</span> <span class="n">expect</span> <span class="n">the</span> <span class="k">current</span> <span class="n">token</span> <span class="k">to</span> <span class="n">be</span> <span class="n">a</span> <span class="s1">'+'</span> <span class="n">token</span>
<span class="n">op</span> <span class="o">=</span> <span class="k">self</span><span class="p">.</span><span class="n">current_token</span>
<span class="k">self</span><span class="p">.</span><span class="n">eat</span><span class="p">(</span><span class="n">PLUS</span><span class="p">)</span>
<span class="o">#</span> <span class="n">we</span> <span class="n">expect</span> <span class="n">the</span> <span class="k">current</span> <span class="n">token</span> <span class="k">to</span> <span class="n">be</span> <span class="n">a</span> <span class="n">single</span><span class="o">-</span><span class="n">digit</span> <span class="nb">integer</span>
<span class="k">right</span> <span class="o">=</span> <span class="k">self</span><span class="p">.</span><span class="n">current_token</span>
<span class="k">self</span><span class="p">.</span><span class="n">eat</span><span class="p">(</span><span class="nb">INTEGER</span><span class="p">)</span>
<span class="o">#</span> <span class="k">after</span> <span class="n">the</span> <span class="n">above</span> <span class="k">call</span> <span class="n">the</span> <span class="k">self</span><span class="p">.</span><span class="n">current_token</span> <span class="k">is</span> <span class="k">set</span> <span class="k">to</span>
<span class="o">#</span> <span class="n">EOF</span> <span class="n">token</span>
<span class="o">#</span> <span class="k">at</span> <span class="n">this</span> <span class="n">point</span> <span class="nb">INTEGER</span> <span class="n">PLUS</span> <span class="nb">INTEGER</span> <span class="n">sequence</span> <span class="k">of</span> <span class="n">tokens</span>
<span class="o">#</span> <span class="n">has</span> <span class="n">been</span> <span class="n">successfully</span> <span class="k">found</span> <span class="k">and</span> <span class="n">the</span> <span class="k">method</span> <span class="n">can</span> <span class="n">just</span>
<span class="o">#</span> <span class="k">return</span> <span class="n">the</span> <span class="k">result</span> <span class="k">of</span> <span class="n">adding</span> <span class="n">two</span> <span class="n">integers</span><span class="p">,</span> <span class="n">thus</span>
<span class="o">#</span> <span class="n">effectively</span> <span class="n">interpreting</span> <span class="n">client</span> <span class="k">input</span>
<span class="k">result</span> <span class="o">=</span> <span class="k">left</span><span class="p">.</span><span class="n">value</span> <span class="o">+</span> <span class="k">right</span><span class="p">.</span><span class="n">value</span>
<span class="k">return</span> <span class="k">result</span>
<span class="n">def</span> <span class="n">main</span><span class="p">():</span>
<span class="n">while</span> <span class="k">True</span><span class="p">:</span>
<span class="n">try</span><span class="p">:</span>
<span class="o">#</span> <span class="k">To</span> <span class="n">run</span> <span class="k">under</span> <span class="n">Python3</span> <span class="k">replace</span> <span class="s1">'raw_input'</span> <span class="k">call</span>
<span class="o">#</span> <span class="k">with</span> <span class="s1">'input'</span>
<span class="nb">text</span> <span class="o">=</span> <span class="n">raw_input</span><span class="p">(</span><span class="s1">'calc> '</span><span class="p">)</span>
<span class="k">except</span> <span class="n">EOFError</span><span class="p">:</span>
<span class="n">break</span>
<span class="k">if</span> <span class="k">not</span> <span class="nb">text</span><span class="p">:</span>
<span class="k">continue</span>
<span class="n">interpreter</span> <span class="o">=</span> <span class="n">Interpreter</span><span class="p">(</span><span class="nb">text</span><span class="p">)</span>
<span class="k">result</span> <span class="o">=</span> <span class="n">interpreter</span><span class="p">.</span><span class="n">expr</span><span class="p">()</span>
<span class="n">print</span><span class="p">(</span><span class="k">result</span><span class="p">)</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
<span class="n">main</span><span class="p">()</span>
</code></pre></div>
<p>保存上述代码为calc1.py,可以使用python解释器解释运行上述解释器脚本。</p>
<div class="highlight"><pre><span></span><code>$ python calc1.py
calc> <span class="m">3</span>+4
<span class="m">7</span>
calc> <span class="m">3</span>+5
<span class="m">8</span>
calc> <span class="m">3</span>+9
<span class="m">12</span>
calc>
</code></pre></div>
<p>关于这个解释器:</p>
<ul>
<li>输入只支持一位整数</li>
<li>只支持假发</li>
<li>不允许空格出现</li>
</ul>
<p>那么这个解释器的工作原理,下面以 <em>3+5</em> 进行举例,首先拆解运算元素成token,而token是一种有类型和值的对象,这个过程也叫做词法分析(lexical analysis),他还有scanner,tokenizer的别称。
拆解过程如下:
<img alt="image" src="https://ruslanspivak.com/lsbasi-part1/lsbasi_part1_lexer1.png">
<img alt="image" src="https://ruslanspivak.com/lsbasi-part1/lsbasi_part1_lexer2.png">
<img alt="image" src="https://ruslanspivak.com/lsbasi-part1/lsbasi_part1_lexer3.png">
可以看到距离要完成一个解释器我们还十分遥远,欢迎继续关注本博客,原文参考<a href="https://ruslanspivak.com/lsbasi-part1/">ruslan‘sblog</a></p></div>
<hr>
<a href="https://twitter.com/share" class="twitter-share-button" data-text="Let’s Build A Simple Interpreter. Part 1." data-via="YXTkbHci1iEWgAM">Tweet</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
<h2>Comments</h2>
<div id="disqus_thread"></div>
<script type="text/javascript">
var disqus_shortname = 'kuikui';
var disqus_title = 'Let’s Build A Simple Interpreter. Part 1.';
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = 'https://' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
</div>
</div>
<div class="span3">
<div class="well" style="padding: 8px 0; background-color: #FBFBFB;">
<ul class="nav nav-list">
<li class="nav-header">
Site
</li>
<li><a href="https://kuikui.tech/archives.html">Archives</a>
<li><a href="https://kuikui.tech/tags.html">Tags</a>
<li><a href="https://kuikui.tech/feeds/all.atom.xml" rel="alternate">Atom feed</a></li>
</ul>
</div>
<div class="well" style="padding: 8px 0; background-color: #FBFBFB;">
<ul class="nav nav-list">
<li class="nav-header">
Categories
</li>
<li><a href="https://kuikui.tech/category/gan-xiang-yu-ji-lu.html">感想与记录</a></li>
<li><a href="https://kuikui.tech/category/ji-qi-xue-xi.html">机器学习</a></li>
<li><a href="https://kuikui.tech/category/lei-bie.html">类别</a></li>
<li><a href="https://kuikui.tech/category/python.html">python</a></li>
<li><a href="https://kuikui.tech/category/shua-ti-bi-ji.html">刷题笔记</a></li>
<li><a href="https://kuikui.tech/category/sui-xiang.html">随想</a></li>
<li><a href="https://kuikui.tech/category/yue-du-bi-ji.html">阅读笔记</a></li>
<li><a href="https://kuikui.tech/category/yun-wei.html">运维</a></li>
</ul>
</div>
<div class="well" style="padding: 8px 0; background-color: #FBFBFB;">
<ul class="nav nav-list">
<li class="nav-header">
Links
</li>
<li><a href="https://github.com/kk456852/">Github</a></li>
<li><a href="https://twitter.com/YXTkbHci1iEWgAM/">twitter</a></li>
<li><a href="https://kuikui.tech/">blog</a></li>
</ul>
</div>
<div class="social">
<div class="well" style="padding: 8px 0; background-color: #FBFBFB;">
<ul class="nav nav-list">
<li class="nav-header">
Social
</li>
<li><a href="https://mahaoqu.github.io/">Teacher Ma</a></li>
<li><a href="#">虚位以待</a></li>
</ul>
</div>
</div>
</div>
</div> </div>
<footer>
<br />
<p><a href="https://kuikui.tech">kizzy的个人博客</a> © kizzy 2020</p>
</footer>
</div> <!-- /container -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="https://kuikui.tech/theme/bootstrap-collapse.js"></script>
<script>var _gaq=[['_setAccount','UA-158839315-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'))</script>
</body>
</html>