/********* WRITEN BY ZZG *********//******** DATE: 12,25,2017 *******/
/*** JJTree template file created by SF JavaCC plugin 1.5.28+ wizard for JavaCC 1.5.0+*/
                 //这是.jjt文件内容
options
{static = true;
}PARSER_BEGIN(MyNewGrammar)
package test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import util.*;public class MyNewGrammar
{public static void main(String args []){FileInputStream fileStream;try {fileStream = new FileInputStream("test2.c");            //测试请在此处修改test1.c,test2.c,test3.cMyNewGrammar parser = new MyNewGrammar(fileStream);System.out.println("Reading from file ...");try {SimpleNode rootNode = parser.Start();rootNode.dump(" ");//抓取返回的语法树。    } catch (Exception e) {System.out.println("NOK.");System.out.println(e.getMessage());} catch (Error e) {System.out.println("Oops.");System.out.println(e.getMessage());}} catch (FileNotFoundException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}
}PARSER_END(MyNewGrammar)SKIP :
{" "
| "\t"
| "\n"
| "\r"
| < "//" (~[ "\n", "\r" ])*("\n"| "\r"| "\r\n") >
| < "/*" (~[ "*" ])* "*"(~[ "/" ] (~[ "*" ])* "*")*"/" >
}
TOKEN :
{< CONSTANT: ( <DIGIT> )+("."(< DIGIT>)+)? >
|   < DIGIT: ["0" - "9"] >
}
TOKEN : /* LITERALS */
{< INTEGER_LITERAL :< DECIMAL_LITERAL > ([ "l", "L" ])?| < HEX_LITERAL > ([ "l", "L" ])?| < OCTAL_LITERAL > ([ "l", "L" ])? >
| < #DECIMAL_LITERAL : [ "1"-"9" ] ([ "0"-"9" ])* >
| < #HEX_LITERAL : "0" [ "x", "X" ] ([ "0"-"9", "a"-"f", "A"-"F" ])+ >
| < #OCTAL_LITERAL : "0" ([ "0"-"7" ])* >
}TOKEN : /* KEYWORDS */
{< MAIN : "main">| < INT : "int">| < FLOAT: "float" >| < VOID : "void">| < IF:"if">| < ELSE:"else" >| < WHILE:"while" >| < FOR:"for" >| < RETURN:"return">
}TOKEN : /* OPERATORS */
{< PLUS:"+">| < MINUS:"-">| < MULTIPLY:"*">| < DIVIDE:"/">| < ASSIGN:"=">
}
TOKEN : /* RELATIONSHIPOPERATOR */
{< LT:"<"  >| < LE:"<=" >| < GT:">"  >| < GE:"=>" >| < EQ:"==" >| < NE:"!=" >
}TOKEN : /* IDENTIFIERS */
{< IDENTIFIER :< LETTER >(< LETTER >| < DIGIT >)* >
| < #LETTER : [ "_", "a"-"z", "A"-"Z" ] >
}
TOKEN:
{<LC:"(">| <RC:")">| <LM:"[">| <RM:"]">| <LB:"{">| <RB:"}">
}
SimpleNode Start() :
{}
{Expression(){return jjtThis;}
}void Expression() :
{}
{< INT >< MAIN >< LC >< RC >< LB > MainStatement() < RB >
}void MainStatement():{}
{Statement()//|(MainStatement())*
}
void Statement(): {QTTable qtTable=new QTTable(); }        //qtTable应该在最前面声明,然后作为参数传递下去
{(SequenceStatement(qtTable)                        //顺序语句| IfStatement(qtTable)                            //条件语句| While(qtTable)                              //循环语句)*{QTInfo END=new QTInfo("","","","");   //结束qtTable.addQTInfo(END);//qtTable.falseChain.add(END);qtTable.trueChain.add(END);qtTable.mergeFalseChain();      //回填假链qtTable.mergeTrueChain();     //回填真链qtTable.printQTTable();       //打印全局四元式}
}
//顺序
void SequenceStatement(QTTable qtTable): { }
{(declaration(qtTable)|copy(qtTable)) ";"         //声明和赋值
}
void declaration(QTTable qtTable) : {Token first,middle;Token eq=null;
}
{//每行定义一个数组,但可定义多个变量(< INT>|< FLOAT>) middle=< IDENTIFIER> ( eq=< ASSIGN>first=< CONSTANT> {QTInfo qt=new QTInfo(eq.image,first.image,"_",middle.image);qtTable.addQTInfo(qt); } //这里只对声明的第一个赋值变量增加了语义子程序,若对后续赋值声明添加则需定义first和middle为Token数组)? (","< IDENTIFIER >)*(< LM> < CONSTANT> < RM>)*  //可声明多维
}
void copy(QTTable qtTable): {String first;Token middle;Token eq=null;
}
{(middle=< IDENTIFIER>) (eq=< ASSIGN>) (first=expression(qtTable)) {QTInfo qt=new QTInfo(eq.image,first,"_",middle.image);qtTable.addQTInfo(qt);}
}
//条件void IfStatement(QTTable qtTable):{String skipStr;QTInfo pre;}
{< IF>< LC>Condition(qtTable)< RC> { pre=qtTable.getLastQt();}(((assign(qtTable) ";") | (< LB> SequenceStatement(qtTable){/*qtTable.trueChain.add(qtTable.getNextQt(pre));*/}< RB>))/*{ qtTable.trueChain.add(qtTable.getLastQt());}*///真链跳转进入表达式时应该是该语句块的第一个语句的位置){skipStr=VariableNameGenerator.genVariableName();QTInfo qt1=new QTInfo("J","_","_",skipStr);qtTable.addQTInfo(qt1);qtTable.trueChain.add(qt1);}//条件为真执行完毕后跳转(跳过else语句块)ElseStatement(qtTable)
}
void ElseStatement(QTTable qtTable): { }
{< ELSE> ((< LB> SequenceStatement(qtTable) < RB>)|IfStatement(qtTable)|assign(qtTable) ";"){qtTable.falseChain.add(qtTable.getLastQt());}
}
//为使易于模块理解,copy()和assign()实则相同
void assign(QTTable qtTable): { String first;Token middle;Token eq=null;
}
{(middle=< IDENTIFIER>) (eq=< ASSIGN>) (first=expression(qtTable)) {QTInfo qt=new QTInfo(eq.image,first,"_",middle.image);qtTable.addQTInfo(qt);}
}
String Condition(QTTable qtTable) :{ String left,right,newTemp=null,falseStr,trueStr; Token rp; QTInfo pre;}
{(left=expression(qtTable) (//<,<=,>,>=,==,!=(rp=< LT>|rp=< LE>|rp=< GT>|rp=< GE>|rp=< EQ>|rp=< NE>) right=expression(qtTable) { } ){//qtTable.trueChain.add(qtTable.getLastQt());//QTInfo pre=qtTable.getLastQt();newTemp=VariableNameGenerator.genVariableName();falseStr=VariableNameGenerator.genVariableName();QTInfo qt1=new QTInfo("J"+rp.image,left,right,newTemp);qtTable.trueChain.add(qt1);//qtTable.trueChain.add(pre);QTInfo qt2=new QTInfo("J","_","_",falseStr);qtTable.falseChain.add(qt2);//QTInfo qt3=new QTInfo(""); qtTable.addQTInfo(qt1);qtTable.addQTInfo(qt2);} ){return newTemp;}
}
String expression(QTTable qtTable): {String first,middle,newTemp; Token op; }
{    first=term(qtTable) {newTemp=first; }((op=< PLUS >|op=< MINUS >) middle=term(qtTable) {newTemp= VariableNameGenerator.genVariableName();QTInfo qt=new QTInfo(op.image,first,middle,newTemp);qtTable.addQTInfo(qt);first=newTemp;})*{return newTemp; }
}
String term(QTTable qtTable): {String first,middle,newTemp; Token op; }
{first=unary(qtTable) {newTemp=first; }(( op=< MULTIPLY >|op=< DIVIDE> ) middle=unary(qtTable) {newTemp=VariableNameGenerator.genVariableName();QTInfo qt=new QTInfo(op.image,first,middle,newTemp);qtTable.addQTInfo(qt);first=newTemp;            })*{return newTemp;}
}
String unary(QTTable qtTable) :{String str=null;Token token=null; }
{(token=< IDENTIFIER> { str=token.image; } |token=< CONSTANT> {str=token.image; }|(< LC>str=expression(qtTable)< RC>)) { return str;}
}
//循环
void While(QTTable qtTable):{}
{//支持赋值拷贝、四则运算、条件语句块、循环语句块的嵌套but目前只支持赋值语句,(#^_^#)< WHILE>< LC>Condition(qtTable)< RC>< LB>(copy(qtTable))*";"< RB>
}

//这是QTTable的内容

package util;import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Iterator;public class QTTable {public ArrayList<QTInfo> QTList = new ArrayList<QTInfo>();public ArrayList<QTInfo> falseChain=new ArrayList<QTInfo>();public ArrayList<QTInfo> trueChain=new ArrayList<QTInfo>();public static boolean flag = true;public void addQTInfo(QTInfo info) {QTList.add(info);}public void addQTInfo(int index, QTInfo info) {QTList.add(index, info);}public QTInfo get(int index) {return (QTInfo) QTList.get(index);}public QTInfo remove(int index) {return QTList.remove(index - 1);}public void clear() {QTList.clear();QTInfo.innerIdSeqen = 0;}public void printQTTable() {// System.out.println(toString());Iterator<QTInfo> itr = QTList.iterator();try {File f = new File("result2.c"); //结果文件输出if (f.exists()) {} else {f.createNewFile();// 不存在则创建}FileWriter output;output = new FileWriter(f,false);while (itr.hasNext()) {QTInfo tmp = (QTInfo) itr.next();output.write(tmp.toString()+"\n");output.flush();System.out.println(tmp.toString());}output.close();} catch (Exception e) {e.printStackTrace();}}public QTInfo getLastQt(){        //获取表中最后的一个元素return get(QTList.size()-1);}public QTInfo getNextQt(QTInfo first){Iterator<QTInfo> itr = QTList.iterator();while(itr.hasNext()){if(itr.next()==first)return (QTInfo)itr.next();}return null;}public void mergeFalseChain(){  //回填假链Iterator<QTInfo> itr=falseChain.iterator();int count=0;while(itr.hasNext()&&count<falseChain.size()-1){QTInfo one = (QTInfo) itr.next();//QTInfo next = (QTInfo) itr.next();//此处需要得到下一个QTInfo但是又不能使itr的指针往下移QTInfo next = falseChain.get(count++);one.setResult(next.getInnerIdSeqen()-1);}/*Iterator<QTInfo> itr0=QTList.iterator();while(itr0.hasNext()){QTInfo temp0=(QTInfo) itr0.next();itr=falseChain.iterator();while(itr.hasNext()){QTInfo temp=(QTInfo) itr.next();if(temp0.getInnerIdSeqen()==temp.getInnerIdSeqen()){temp0.setInnerId(temp.getInnerIdSeqen());}}}*/}public void mergeTrueChain(){  //回填真链Iterator<QTInfo> itr=trueChain.iterator();int count=0;while(itr.hasNext()&&count<trueChain.size()-1){QTInfo one = (QTInfo) itr.next();if(count==0){one.setResult(4);count++;}else{QTInfo next = trueChain.get(count++);one.setResult(next.getInnerIdSeqen());}}}// public ArrayList<QTInfo> getQTList() {// // TODO Auto-generated method stub// return QTList;// }}

///这是QTInfo

package util;//定义四元式的信息
public class QTInfo {public static int innerIdSeqen = 0; // 四元式全局个数private int innerId; // 当前四元式IDprivate String operator;private String arg1;private String arg2;private String result;public QTInfo(String operator, String arg1, String arg2, String result) {super();this.innerId = ++innerIdSeqen;this.operator = operator;this.arg1 = arg1;this.arg2 = arg2;this.result = result;}public QTInfo(String operator, String arg1, String arg2, int result) {this(operator, arg1, arg2, result + "");}public String getOperator() {return this.operator;}public void setResult(String result) {this.result = result;}public void setResult(int result) {this.result = "" + result;}public String getResult() {return this.result;}public void setInnerId(int innerID) {this.innerId = innerID;}public int getInnerIdSeqen() {return innerIdSeqen;}public String toString() {// TODO Auto-generated method stubreturn this.innerId + ":\t( " + this.operator + " \t" + this.arg1+ " \t" + this.arg2 + " \t" + this.result + " )";}
}

最后,我想说的是->_-> :mmp,写完了才发现自己把某些自带的功能又实现了一遍。

基于MiniC的语义分析(使用javacc)相关推荐

  1. 情感分析基于词典(算例代码)

    基于词典的情感分析 情感分析是指挖掘文本表达的观点,识别主体对某客体的评价是褒还是贬,褒贬根据进态度行倾向性研究.文本情感分析可以分为基于机器学习的情感分类方法和基于语义理解的情感分析.基于机器学习进 ...

  2. 自然语言语义分析研究进展_笔记

    自然语言语义分析研究进展_笔记 词语语义分析:确定词语意义,衡量两个词之间的语义相似度或相关度; 句子语义分析:研究包含句义分析和句义相似度分析两方面; 文本语义分析:识别文本的意义.主题.类别等语义 ...

  3. 微软亚研院20周年独家撰文:数据智能的现在与未来

    文:微软亚洲研究院软件分析组 来源:雷锋网 摘要:今年是微软亚洲研究院(MSRA)20周年,站在这个大节点上,MSRA副院长张冬梅以及她的团队写了这篇有关数据智能的文章,对该领域的发展和未来进行梳理. ...

  4. vim win装_VIM的代码补全工具YouCompleteMe在Windows上的安装攻略

    前言 用VIM写代码也有很多年了,一直使用其内嵌的自动补全.这种补全没有任何语义分析,仅仅根据当前打开的文件,收集所有的单词形成一个补全库.在输入时,根据已经输入的字母,用逐个字母匹配的方式来寻找可能 ...

  5. ISC2015听会小计

    今天,冒雨去国家会议中心听取ISC2015大会,期间有些许收获,记录.分享: 1.个人感觉云计算安全与传统网络安全,在防御方面最大的不同是:传统网络防御可以把待防御对象看成信息孤岛,因此,边界性很强; ...

  6. 预见未来 | 数据智能的现在与未来

    编者按:自1998年成立以来,微软亚洲研究院一直致力于推动计算机科学领域的前沿技术发展.在建院20周年之际,我们特别邀请微软亚洲研究院不同领域的专家共同撰写"预见未来"系列文章,以 ...

  7. 如何利用计算机做主题模型,利用概率主题模型的微博热点话题发现方法-计算机系统应用.PDF...

    利用概率主题模型的微博热点话题发现方法-计算机系统应用 2014 年 第 23 卷 第 8 期 计 算 机 系 统 应 用 ① 利用概率主题模型的微博热点话题发现方法 1 2 米文丽 , 孙曰昕 1( ...

  8. 高德JS依赖分析工程及关键原理

    一.背景 高德 App 进行 Bundle 化后,由于业务的复杂性,Bundle 的数量非常多.而这带来了一个新的问题--Bundle 之间的依赖关系错综复杂,需要进行管控,使 Bundle 之间的依 ...

  9. 肯耐珂萨助力世界500强零售企业在线春招:单次面试3000人

    "今年874万应届毕业生太难了",据官方统计数据显示,毕业生人数比2019年还要多40万,这已经是继2008年之后连续12年的人数上涨.加之春招不赶巧,撞上了新冠肺炎疫情,不出意外 ...

  10. 《正版 图解语音识别 语音识别入门实践教程 语音识别技术书 人工智能机器学习深度学习计算机网络编程书籍R3Z978》[日]荒木雅弘著【摘要 书评 在线阅读】-苏宁易购图书...

    商品参数 图解语音识别 定价 59.00 出版社 人民邮电出版社 版次 1 出版时间 2020年04月 开本 32开 作者 [日]荒木雅弘 装帧 平装-胶订 页数 字数 ISBN编码 97871155 ...

最新文章

  1. 平台允许同时在线人数 显示_糖豆人:终极淘汰赛 热度持续飙升 Steam同时在线人数排名前四...
  2. Matlab中只运行m文件中部分程序的方法
  3. 第十、十一周项目-阅读程序,写出这些程序的运行结果(3)
  4. MySQL存储过程总结(二)
  5. php soap对象数组,nusoap传递数组对象
  6. Java内部类及其实例化
  7. python 利用抛出异常并处理的优点
  8. 关联分析:FP-Growth算法
  9. cppcheck的安装和使用
  10. java实现多线程抢单_JAVA实现多线程的四种方式
  11. 防脱洗发水是个伪命题?8979 条数据告诉你答案!
  12. div旋转45度_一看就会,一做不废的旋转楼梯建模
  13. wpa_supplicant使用
  14. 基于ssm+java+sql企业名录综合统计系统
  15. 哔哩哔哩中缓存的视频和音频如何合并
  16. java assert 断言_Java 之 assert (断言)
  17. 使用pytorch搭建AlexNet网络模型
  18. 解决东方财富数据接口激活后仍显示reactive的问题
  19. swing打地鼠游戏_经典街机游戏中的那些奖励关,为了得高分每次都被游戏厅老板吼...
  20. 时空之轮Android手柄,时空之轮图文完整攻略(超时空之轮(ChronoTrigger)最详细攻略图文详解)...

热门文章

  1. 数仓OLAP(一)--即席查询 Kylin
  2. 六轴传感器+卡尔曼滤波+一阶低通滤波
  3. nagios监控详解
  4. 众为兴SCARA四轴机械臂编程(二)——基于硬接线替代Modbus通讯
  5. JSON值的获取以及遍历 [JSON]
  6. 树莓派容器中aplay没有声音的解决方案
  7. Java异或运算和校验
  8. 【机器学习项目实战】随机森林(random forest)回归(RandomForestRegressor)模型Python实现
  9. C#语言和doNet框架
  10. DoNet6新特性 PriorityQueue 优先队列终于来啦~