0%

Java开发编译器(1)-LexerDemo

Github链接

编写目的

在观看了几份视频后决定先开发一个LexerDemo类,用于展示词法分析的含义,也即LexerDemo类仅展示词法分析的输入和词法分析的输出,不展示其余任何东西,开放的接口仅有无参构造函数和用于返回词法分析结果的lex方法。LexerDemo用于对仅含非负整数,加减乘除的运算表达式做词法分析。

遇到的问题

确定需求

第一天做主要是写文档,确定需求,本来打算按照视频中的完成一个可以基本和语法分析器一起工作的Lexer类,但是后来还是算了,原因是词法分析和语法分析的合作方式有两种

  1. 词法分析和语法分析交替工作,也即语法分析需要Token时,向词法分析索要,词法分析再向前运作
  2. 词法分析首先完成工作,然后将所有的Token存放起来,以便语法分析使用

两种方式各有优劣:

  1. 第一种方式不需要在内存中存放一个Token List,节约空间,但是只能有常数级(通常是一个)的lookahead
  2. 第二种方式便于语法分析,可以在已完成的Token List上跑多遍的语法分析,获得更好的结果

视频中的合作方式是第一种,我打算到时候再看能实现哪一种或者两种

JavaDoc编写中的问题


Q: javadoc中如何加入 inline code?
A: <code>. 最早发现这个问题是因为插入代码时都是用的<pre>,但是这是用来插入代码块的,搜索之后发现应该使用<code>


Q: javadoc中如何加入字符 <, >?
A: & lt; & gt; (分号不能忘记)由于javadoc实际上是html,所以这两个字符有特殊含义,需要这样转义。


如何引入JUnit

在eclipse中,可以使用 Project > Properties > Java Build Path > Libraries > add library…

在IntelliJ IDEA中,可以直接 @Test 然后在报错后将鼠标移动到上面,会有引入Junit的选项出现

编后感

其实也没啥,由于只是一个Demo,用来展示词法分析的大概含义的,没有考虑到和语法分析器合作的问题,
而且选定的对象也是包含加减乘除的四则算术表达式,本身词法规则就很简单,结果写下来只是个70来行的小程序(晕~)。

但是硬生生配了100+行的测试,测试实在是太方便了,只需要Run一下就可以一键测试,基本的测试策略是将输入分为几个维度:

  1. 包含 +,-,*,/,数字,非法字符
  2. 单行或多行
  3. 单次输入分析和多次输入分析

最终每个纬度的每个方面都至少有一个测试样例覆盖到了,代码覆盖率(分支覆盖率)也达到了百分之百。