关于词法分析和语法分析

本文介绍了作者在阅读《自己动手写编译器,链接器》后,按照书中的指导编写SC语言编译器Scc的过程。主要涉及词法分析、空格和换行处理、Token识别以及文法解析规则的实现。在实现过程中,作者遇到了语言差异和文法定义不符的问题,并通过Scala的特性进行了优化,如利用隐式参数简化代码修改工作。
摘要由CSDN通过智能技术生成

    最近,在看了《自己动手写编译器,链接器》之后,便打算按照书中的思路,来完成一个sc语言的编译器scc。由于我对scala较为熟悉,所以自此开始着手进行lexer和parser的编写。

    抛弃那些专业术语,从业余的角度来讲,要完成对源码的解析和分割,着色和打印,需要解决以下几个问题。

    1. 按字节读取源码,能够提前读取下一个或者多个字节内容然后回退到未读的状态。

    在java中已经有现成的工具类PushBackInputStream,能够在尝试读取多个字节内容后回退到未读状态。

    2. 空格和换行的处理。

    由于sc语言以括号和分号结尾,所以对于任何空格和换行,都以跳过处理。

    3. 确定各种类型的Token以及处理的方式。

    由于书中已经给出了sc语言的定义,关键字的详细说明和处理方式,所以只需要按部就班就可以完成对源码全文的处理。

    4.文法解析以及打印时缩进和换行的控制。

    根据书中给出的BNF文法定义,依次写出整个源码的文法解析规则。由于书中有对应的解释和示例代码,所以使用scala改写时并无难度。同时,为了控制缩进和换行,引入了两个全局变量(当然用scala改写时作为构造参数全局传递),分别控制缩进等级和是否换行。

    可能遇到的问题和解决方案都已经说明,接下来就只需要完成代码的填补就好。但是在实际编写调试过程中也遇到了不少问题。一方面是由于语言的差异(书中以c语言编写),另一方面在某些细节地方,我觉得书中给出的编码实现跟实际的文法定义并

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值