摘要:实现了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