Rumah >pembangunan bahagian belakang >Tutorial Python >如何用Yacc实现一个Python的编译器?
YACC for ansi C 的文法在很多地方都可以找到了。为什么没有Python的?如何把Python源代码中的grammar编译成yacc的?
1:python这种靠缩进的语言的文法其实是上下文有关的,EBNF是表达不出来的,我不知道yacc是不是有什么丧心病狂的扩展来给你做这个。
2:每一行前面的tab的数量你不要看成一堆tab,要把他的数量本身看成一个整体,也就是说再作语法分析的时候其实是:
<code class="language-python"><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="k">def</span> <span class="nf">fuck</span>
<span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="k">if</span> <span class="n">true</span><span class="p">:</span>
<span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="n">fuck</span>
<span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="k">else</span><span class="p">:</span>
<span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="n">shit</span>
<span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="k">def</span> <span class="nf">shit</span>
<span class="o">..</span>
</code>
主要是缩进语法的问题吧,只要先在词法上把python的缩进改成类似大括号分界的语法即可,压力在lex这边<code class="language-python"><span class="k">while</span> <span class="n">i</span> <span class="o"> <span class="mi">100</span><span class="p">:</span>
<span class="k">print</span> <span class="n">i</span>
<span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
</span></code>
还不如直接看python源码里的interpreter好了。
COOL都日出来了,python算个DIAO啊,文法拿去,玩吧。写完了我们膜拜一下。