一个SLR,LR,LALR语法分析器

这些天我编写了一些语法分析器,它能够分析符合SLR,LR,LALR规范的语句。所有的类都放在syntexparse包中。算法来自与龙书。下面是一些用法。

Symbol类表示文法中的终结符和非终结符。

构造函数的第一个参数为符号名称,类型为String。第二个参数表示该符号是终结符还是非终结符,类型为boolean。
用法:对于推导规则E->E+T中文法符号E,+,T可以这样来表示
非终结符E:Symbol expression=new Symbol("E",false);
终结符+  :Symbol plus=new Symbol("+",true);
Symbol构造函数的第二个参数如果是false就表示该符号为非终结符,反之就是终结符。
非终结符的定义可以省略第二个参数,就像
非终结符T:Symbol term=new Symbol("T");

 

Production类表示文法的推导规则。

构造函数的第一个参数表示规则的首部,类型为Symbol。第二个参数表示规则体,类型为Symbol[]。
用法:对于上面的推导规则E->E+T可以这样表示
Production p=new Production(expression,new Symbol[]{expression,plus,term});

 

LRMaker类,SLRMaker类和LALRMaker类分别用来构造LR(1),SLR,LALR分析表。它们实现了ParserGenerator接口。

这是ParserGenerator接口:

对于如下的分析表

getGotoTable返回分析表中的goto表,getActionTable中的Action表。我使用了Map来表示分析表。表中的状态+文法符号组成的String做为键值。所以要取得状态0遇到符号c该执行的动作就调用ActionTable.get(0+"c")。

可以使用SLRGenFactory,LRGenFactory,LALRGenFactory类来生成满足ParserGenerator接口的分析表构造类LRMaker,SLRMaker和LALRMaker。例如要构造如下语法的LR分析表:

S'->S
S->CC
C->cC|d

 

Parser类用分析表来进行语法分析。
使用Parser对如下文法进行分析:
E'->E
E->E+T|T
T->T*F|F
F->(E)|id

 

对(id+id)*id$的分析过程如下:

编译包中的Parser类c:/>javac Parser.java
运行Parser类c:/>java syntexparse.Parser,用回车来隔开每个输入符号。


当遇到可规约的表达式时会输出规约步骤。

 

源代码可以在这里下载

csdn下载

google下载

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值