自制脚本语言(3) LR(1) parser generator的实现

摘要:实现了LR(1)的parser generator,读取记录grammar的txt文件,输出记录action table与goto table的txt文件。

源代码在http://download.csdn.net/detail/nklofy/8878579

按照之前的设计并稍微修改,程序的主体流程是:

首先读取grammar.txt。用Map<String, Symbol> gen_symbols保存全部的符号,终结符放入Set<Symbol> gen_NTs,非终结符放入Set<Symbol> gen_tokens。用List<Grammar> gen_grammars保存各条语法生成式。调用函数是input( ), inputGrammars( ), buildGrammars( )。这里另外还调用了一个函数generateGrammarTable( ),生成了List<GrammarTable> gen_gr_tables,这是为了将所有grammar编号,在action table中规约动作需要一个语法句柄编号。则parser时可以根据归约句柄选择合适的函数生成AST。

其次是生成所有符号的first集。调用函数getFirst( ),将所有非终结符的First集计算出来。这里用了一个小技巧,语法的逆序遍历。因为语法越下降,越接近终结符,所以逆序遍历可以便于First集从终结符向非终结符传播,节省循环的次数,提高时间效率。

然后是分析gen_grammars,生成全部的规范族和项集。这一功能是由getCCs( )函数从CC0开始展开而实现的。它调用getCloure( )函数获得各个CC中的全部items,同时依靠getGoto( )函数将item的占位符向前移动一位而生成新的CC(若该CC已存在,则不生成),同时得到旧CC的got

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值