编写目的
在观看了几份视频后决定先开发一个LexerDemo
类,用于展示词法分析的含义,也即LexerDemo
类仅展示词法分析的输入和词法分析的输出,不展示其余任何东西,开放的接口仅有无参构造函数和用于返回词法分析结果的lex
方法。LexerDemo
用于对仅含非负整数,加减乘除的运算表达式做词法分析。
遇到的问题
确定需求
第一天做主要是写文档,确定需求,本来打算按照视频中的完成一个可以基本和语法分析器一起工作的Lexer
类,但是后来还是算了,原因是词法分析和语法分析的合作方式有两种
- 词法分析和语法分析交替工作,也即语法分析需要Token时,向词法分析索要,词法分析再向前运作
- 词法分析首先完成工作,然后将所有的Token存放起来,以便语法分析使用
两种方式各有优劣:
- 第一种方式不需要在内存中存放一个Token List,节约空间,但是只能有常数级(通常是一个)的lookahead
- 第二种方式便于语法分析,可以在已完成的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一下就可以一键测试,基本的测试策略是将输入分为几个维度:
- 包含 +,-,*,/,数字,非法字符
- 单行或多行
- 单次输入分析和多次输入分析
最终每个纬度的每个方面都至少有一个测试样例覆盖到了,代码覆盖率(分支覆盖率)也达到了百分之百。