手工的词法分析器(雏形)

来源:互联网 发布:疯狂联盟人马精魄数据 编辑:程序博客网 时间:2024/05/11 22:38

     昨天上实验课时候要求写一个词法分析器,但是我当时想了一下,其实其实质就是根据一个规则来搜索矩阵,在程序上并没有体现出词法分析的核心技术,怎么小孟哥会拿那个状态转换图来叫人写程序呢,把它转成状态转换矩阵的话可是很庞大的工程,短时间很难实现其对应的词法分析器。当然基于我首次自己根据给定的规则来翻译成代码,所以那节课并没有完成全部功能,只能搭出一个大概的框架,昨晚在宿舍搞了一个晚上才完成基本功能,今晚又对里面的代码重构了一下。等整个雏形出来后,我发现自己还挺笨的,那点东西要搞那么久,看来以后要特训一下才行了。

   现在看看里面的代码,并附上对应的状态转换图和状态转换矩阵,在书中的P71。(注:Main.java是词法分析测试主入口,LexicalAnalysis是词法分析类,ConstructionMatrix是状态转换矩阵 )

 

 状态转换矩阵:

 

状态转换图:

 

   ConstructionMatrix.java 中负责了初始化了状态转换矩阵,并确定了横坐标集charList(字符集)和纵坐标集stateList(状态集)

可能你会问为什么判断是否终态方法和寻找下一状态会放到矩阵类里面,因为判断是否为终态是该类的一个职责所在,使用者不应该知道如何判断终态,更何况使用者是不知道该类中的终态有哪些,也不必知道。

 

LexicalAnalysis.java 中负责将Main中获得的字符串根据空格来划分一个一个子字符串,划分后的子字符串本质上其实是合法性未知的待测词。然后将划分后的子字符串以一个个字符放到矩阵中进行状态转换,检验该词的合法性。

 

看完上面的东西后,你也许会发现这就是那么的一回事。没错,手工的词法分析器编写其实核心部分是状态转换矩阵是怎么来的,那才是词法分析的难点,所以上面的代码并没有什么的。当然以上代码仍需重构,而且可能存在一些bug,否则的话怎么会叫雏形呢~~可惜时间不允许我继续写下去了,太多东西要做啊~~

 

原创粉丝点击