java教程:浅析表驱动词法识别器
时间:2013-03-12 17:11 来源: 翻译器在线 作者:jon
【1】作品介绍:
曾经一段时间,本人沉迷于《编译原理》。设计了自己的语言,想实现其编译器。当时正值报考《程序员》,这也是我为什么没有参加程序员考试的原因。我把编译器的词法分析器已经做出来了。下面介绍一下这个作品。
【2】运行效果:
下面是该词法分析器的使用过程和分析结果,请参考注释。
RealNumber realNum = new RealNumber();//该类中有一个非常核心的数组,用来指导分析器如何分析。
AccidAnalyzer analyzerOfRealNum = new AccidAnalyzer("-1.00100000000",realNum);//产生分析器
System.out.println(analyzerOfRealNum.analyzer());//分析器进行分析,并且打印结果
这是一个分析字符串“-1.00100000000”是不是数字的过程。当然了,打印的结果是ture。对编译原理感兴趣的读者也许通过作品名《表驱动词法识别器》,就能知道我的这个词法分析器的原理了。不了解的读者,往下看也许有收获。
【3】程序亮点:
①词法分析方法众多,这个分析器挑战了难度较大的方法——表驱动词法分析器。表驱动词法分析器是LR分析器的基础。
②成功实现经典理论,该程序完全符合下面的原理:

分析器和分析表是独立的。分析表是由正则表达式得到的,替换不同的分析表,该分析器就能对不分析不同的正则表达式了。
③已经制作两个分析表:
1、识别标识符的Id,由正则表达式“(字母)(字母|数字)*”推导得到。
2、识别数字的RealNumber,这样命名是为了避开基础类库中的Number类。由正则表达式“(+|-|ε)(0|(非零数字)(数字)*)| (0|(非零数字)(数字)*).(数字)*”推导得到。
3、其他的分析表如法炮制。
④逻辑正确,可扩展性强。
【4】不如意之处:
我设计了一个语言,这个词法分析器就是我未完成的编译器的一部分。雄心勃勃想完成该编译器和执行器。但是我发现做编译器非一人之力能及,加之我水平有限,倘若我单独完成需要好几个月,于是暂时搁置。不过我阅读了大量有关的书籍,知识准备已经很充分了,我相信如果一时间的话,一定可以做出来一个完整的编译器。我对该语言的上下文无关文法进行了多次修改。修改后的文法易于实现。该语言的上下文无关文法如下:
L->LP|P
P->f_id(v_id)=E;|v_id=num;|v_id=f_id(num);|println(v_id);
E->E+T|E-T|+T|-T
T->T*F|T/F|T%F|F
F->F^H|H
H->functionN|id|num|idN|N
N->(E)
注:其中的function代表sin、cos、tan、asin、acos、atan、exp、lg、log、sqt、abs、round,等这里可以扩展。
曾经一段时间,本人沉迷于《编译原理》。设计了自己的语言,想实现其编译器。当时正值报考《程序员》,这也是我为什么没有参加程序员考试的原因。我把编译器的词法分析器已经做出来了。下面介绍一下这个作品。
【2】运行效果:
下面是该词法分析器的使用过程和分析结果,请参考注释。
RealNumber realNum = new RealNumber();//该类中有一个非常核心的数组,用来指导分析器如何分析。
AccidAnalyzer analyzerOfRealNum = new AccidAnalyzer("-1.00100000000",realNum);//产生分析器
System.out.println(analyzerOfRealNum.analyzer());//分析器进行分析,并且打印结果
这是一个分析字符串“-1.00100000000”是不是数字的过程。当然了,打印的结果是ture。对编译原理感兴趣的读者也许通过作品名《表驱动词法识别器》,就能知道我的这个词法分析器的原理了。不了解的读者,往下看也许有收获。
【3】程序亮点:
①词法分析方法众多,这个分析器挑战了难度较大的方法——表驱动词法分析器。表驱动词法分析器是LR分析器的基础。
②成功实现经典理论,该程序完全符合下面的原理:

分析器和分析表是独立的。分析表是由正则表达式得到的,替换不同的分析表,该分析器就能对不分析不同的正则表达式了。
③已经制作两个分析表:
1、识别标识符的Id,由正则表达式“(字母)(字母|数字)*”推导得到。
2、识别数字的RealNumber,这样命名是为了避开基础类库中的Number类。由正则表达式“(+|-|ε)(0|(非零数字)(数字)*)| (0|(非零数字)(数字)*).(数字)*”推导得到。
3、其他的分析表如法炮制。
④逻辑正确,可扩展性强。
【4】不如意之处:
我设计了一个语言,这个词法分析器就是我未完成的编译器的一部分。雄心勃勃想完成该编译器和执行器。但是我发现做编译器非一人之力能及,加之我水平有限,倘若我单独完成需要好几个月,于是暂时搁置。不过我阅读了大量有关的书籍,知识准备已经很充分了,我相信如果一时间的话,一定可以做出来一个完整的编译器。我对该语言的上下文无关文法进行了多次修改。修改后的文法易于实现。该语言的上下文无关文法如下:
L->LP|P
P->f_id(v_id)=E;|v_id=num;|v_id=f_id(num);|println(v_id);
E->E+T|E-T|+T|-T
T->T*F|T/F|T%F|F
F->F^H|H
H->functionN|id|num|idN|N
N->(E)
注:其中的function代表sin、cos、tan、asin、acos、atan、exp、lg、log、sqt、abs、round,等这里可以扩展。
本文来源 我爱IT技术网 http://www.52ij.com/jishu/308.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
