package parse;
public class Parse_Token {
boolean flag_main=false; //ѰÕÒmain()
boolean flag_token=false,flag_print=false;//·ÀֹɨÃètokenʱ´í¿ª
Token_List tk_list=null;
static int index=0;
int count=0;//count ¼Ç¼һ¹²ÓжàÉÙ¸ö´íÎó£¬indexÈ«¾Ö±äÁ¿ÊÇÓÃÓÚÈ¡token
Exp_func exp_fun=null;
analyize_error.Error error=null;
public Parse_Token(){
this.tk_list=new HaveToken().getTokenList();
if (this.tk_list!=null){
error=new analyize_error.Error();
parse_start();
}
}
public String[] getToken(int index){
return this.tk_list.getToken(index).toString().split(":");
}
public void parse_start(){
while(index0){
exp_fun=null; //Èç¹ûÓï·¨·ÖÎöÓдíÎó£¬Ôò½«³éÏóÓï·¨Ê÷Öÿգ»
}else{
System.out.println(count+" error(s)");
System.out.println("parse over!!");
}
}
//±È½Ïtoken
public boolean compare_token(String s){
boolean flag=false;
if(getToken(index)[0].equals(s)){
flag=true;
}
return flag;
}
//ÑéÖ¤±êʶ·û
public void parse_mark(String s){
print(s);
if(getToken(index)[0].equals(s)){
index++;
}else{
if(flag_token){
if(getToken(index-1)[0].equals(s)){
flag_token=false; //ÔÚ´ËÌõ¼þÏ£¬ÓÎ±ê²»ÒÆ¶¯¡£
}
}else{
flag_token=true;
count++;
String k[]=getToken(index);
index++;
error.error_print(6, s, k[2], k[3]);
}
}
}
//ÑéÖ¤¹Ø¼ü×Ö
public boolean recognize_keyword(String key){
//print(key);
boolean flag=false;
if(getToken(index)[0].equals(key)){
index++;
flag=true;
}else{
if(flag_token==true){//ÈôÇ°ÃæµÄtoken©дÁË£¬ÔòÕûÌåɨÃè»á´íλ
if(getToken(index-1)[0].equals(key)){
// index++;
flag=true;
flag_token=false;
}
}else{
count++;
error.error_print(7,getToken(index)[1],getToken(index)[2],getToken(index)[3]);
flag_token=true;
// index++;
}
}
return flag;
}
public Exp_func parse_P(){
// recognize_keyword("void");
exp_fun=new Exp_func();
exp_fun.type=type_cal.FUNC;
exp_fun.name=parse_N(); //Ìî³änameÊôÐÔ
parse_mark("(");
if(!getToken(index)[0].equals(")")){
error.error_print(0, getToken(index)[1], getToken(index)[2], getToken(index)[3]);
index++;
// exp_fun.setExp(parse_J()); //Ìí¼Óº¯ÊýµÄ´«µÝ²ÎÊý£»
}
parse_mark(")");
parse_mark("{");
//parse_B();
String next_token=getToken(index)[0];
// boolean flag=true;
while(!next_token.equals("}")){
exp_fun.setExp(parse_if_wh());
next_token=getToken(index)[0];
}
index++;
return exp_fun;
}
//ÓÉÓÚif ºÍwhile¾³£½»²æÊ¹Óã¬Ï໥°üº¬£¬¹Ê¹ÂÁ¢³öÒ»¸öº¯Êý
public Exp parse_if_wh(){
Exp exp=null;
String nexttoken=getToken(index)[0];
switch(nexttoken){
case "if" :exp=parse_I();break;
case "while":exp=parse_W();break;
// case "else":exp=parse_I();break;
case "num":
case "string":
case "bool":exp=parse_M();break;
default: exp=parse_E();break;
}
return exp;
}
//ÑéÖ¤º¯ÊýÌåÄÚ²¿
// public void parse_B(){
// String next_token=getToken(index)[0];
//// boolean flag=true;
// while(!next_token.equals("}")){
//// next_token=getToken(index)[0];
//// if (next_token.equals("return")){
//// index++;
//// parse_R();
//// }else{
// parse_if_wh();
//// }
//// flag=!compare_token("}");
// next_token=getToken(index)[0];
// }
// index++;
// }
//ÑéÖ¤whileÓï¾ä¿é£º
public Exp_whi parse_W(){
Exp_whi whi=new Exp_whi();
whi.type=type_cal.WHI;
recognize_keyword("while");
parse_mark("(");
whi.condition=parse_C();
parse_mark(")");
parse_mark("{");
boolean flag=true;
Exp_B exp_b=new Exp_B();
while(flag){
// parse_if_wh();
Exp exp=null;
String nexttoken=getToken(index)[0];
switch(nexttoken){
case "if" :exp=parse_I();break;
case "while":exp=parse_W();break;
// case "else":exp=parse_I();break;
case "num":
case "string":
case "bool":exp=parse_M();break;
default: exp=parse_E();break;
}
exp_b.setList_exp(exp);
flag=!compare_token("}");
if(flag && flag_token){
if (getToken(index-1)[0].equals("}")){
flag=false;
}
}
}
if(!flag_token){
index++;
}else{
flag_token=false;
}
whi.next=exp_b;
return whi;
}
//ÑéÖ¤returnÓï¾ä£º
// public void parse_R(){
// parse_V();
// parse_mark(";");
// }
// //ÑéÖ¤elseÓï¾ä¿é
// public void parse_EL(){
// recognize_keyword("else");
//
// parse_mark("{");
// while(!compare_token("}")){
// parse_if_wh();
// }
// index++;
// }
//ÑéÖ¤if-elseÓï¾ä¿é
public Exp parse_I(){
Exp_ife ife=null;
// Exp_B exp_b=null;
if(ife==null){
ife=new Exp_ife();
}
ife.type=type_cal.IFE;
if(recognize_keyword("if")){
parse_mark("(");
ife.condition=parse_C();
parse_mark(")");
parse_mark("{");
Exp_B exp_b=new Exp_B();
while(!compare_token("}")){
// parse_if_wh();
Exp exp=null;
String nexttoken=getToken(index)[0];
switch(nexttoken){
case "if" :exp=parse_I();break;
case "while":exp=parse_W();break;
// case "else":exp=parse_I();break;
case "num":
case "string":
case "bool":exp=parse_M();break;
default: exp=parse_E();break;
}
exp_b.setList_exp(exp);
ife.left=exp_b;
}
index++;
}
if(getToken(index)[1].equals("else")){ //´Ë´¦²»Í¬recognize_key()º¯ÊýÊÇ¿¼Âǵ½Ã»ÓÐelse£¬Ò²²»±Ø±¨´í
index++;//ÏàÓ¦µÄ£¬index++
parse_mark("{");
Exp_B exp_b=new Exp_B();
while(!compare_token("}")){
// parse_if_wh();
// ife.right=dothis();
Exp exp=null;
String nexttoken=getToken(index)[0];
switch(nexttoken){
case "if" :exp=parse_I();break;
case "while":exp=parse_W();break;
// case "else":exp=parse_I();break;
case "num":
case "string":
case "bool":exp=parse_M();break;
default: exp=parse_E();break;
}
exp_b.setList_exp(exp);
ife.right=exp_b;
}
index++;
}
return ife;
}
//ÑéÖ¤±í´ïʽ
public Exp_mark parse_E(){
// Exp_mark exp_m=(Exp_mark) getLine_Row(new Exp_mark(),getToken(index));
// exp_m.type=type_cal.ID;
// exp_m.value=parse_V();
Exp_mark exp_m=parse_id();
if (getToken(index)[0].equals("=")){
index++;
exp_m.got=parse_K();
}
parse_mark(";");
return exp_m;
}
//yÑéÖ¤±í´ïʽ=ÓÒ±ß
/*
* K->GG'
* G'->+GG'
* G'->$
*/
//Ò»¸ö±í´ïʽµÄ³éÏóÓï·¨Ê÷µÄ¸ù½ÚµãûÓÐtype;
public Exp_calcul parse_K(){
Exp_calcul exp_calcul=(Exp_calcul) getLine_Row(new Exp_calcul(),getToken(index));
exp_calcul.left=parse_G();
exp_calcul.right=parse_G_();
return exp_calcul;
}
public Exp_calcul parse_G_(){
Exp_calcul exp_calcul=null;
if(getToken(index)[0].equals("+")){
exp_calcul=(Exp_calcul) getLine_Row(new Exp_calcul(),getToken(index));
index++;
exp_calcul.type=type_cal.ADD;
exp_calcul.left=parse_G();
exp_calcul.right=parse_G_();
// parse_G();
// parse_G_();
}else if(getToken(index)[0].equals("-")){
exp_calcul=(Exp_calcul) getLine_Row(new Exp_calcul(),getToken(index));
index++;
exp_calcul.type=type_cal.ADD;
exp_calcul.left=parse_G();
exp_calcul.right=parse_G_();
}else{
}
return exp_calcul;
}
/*Ïû³ý×óµÝ¹é£ºG->G*A|A
* G->VA_
* A_->*VA_
* A_->$
*/
public Exp_calcul parse_G(){
// Exp_mark exp_m=null;
Exp_calcul exp_calcul=new Exp_calcul();
exp_calcul.left=parse_id();
exp_calcul.right=parse_A_();
return exp_calcul;
}
//ÔÚ´Ë´¦½âÎöµÄʱºò»Ø·µ»ØÒ»¸öÒÔ¼ÆËã·ûºÅΪ¸ù½ÚµãµÄÊ÷£¬ÎÞ·¨±£Ö¤ÓÒ×ÓÊ÷ÊÇ·ñΪ¿Õ
public Exp_calcul parse_A_(){
// Exp_mark exp_m=null;
Exp_calcul exp_calcul=null;
if(getToken(index)[0].equals("*")){
exp_calcul=(Exp_calcul) getLine_Row(new Exp_calcul(),getToken(index));
index++;
exp_calcul.type=type_cal.MUL;
exp_calcul.left=parse_id();
exp_calcul.right=parse_A_();
}else if(getToken(index)[0].equals("/")){
exp_calcul=(Exp_calcul) getLine_Row(new Exp_calcul(),getToken(index));
index++;
exp_calcul.type=type_cal.DIV;
exp_calcul.left=parse_id();
exp_calcul.right=parse_A_();
//do nothing
}else{
}
return exp_calcul;
}
public Exp_mark parse_id(){
String[] s=getToken(index);
Exp_mark exp=null;
exp=(Exp_mark) getLine_Row(new Exp_mark(),s);
if(compare_token("id")){
exp.value=s[1];
exp.type=type_cal.ID;
index++;
}else if(compare_token("id_string")){
index++;
exp.value=s[1];
exp.type=type_cal.NORMAL_STRING;
}else if(compare_token("id_num")){
index++;
exp.value=s[1];
exp.type=type_cal.NORMAL_NUM;
}
else{
count++;
error.error_print(1, getToken(index)[1], getToken(index)[2], getToken(index)[3]);
index++;
}
return exp;
}
// //ÑéÖ¤±äÁ¿»òÕß³£Á¿
// public String parse_(){
// String[] s=getToken(index);
//// Exp_mark exp=null;
//// exp=(Exp_mark) getLine_Row(new Exp_mark(),s);
//
// if(compare_token("id")){
//// exp.value=s[1];
//// exp.type=type_cal.ID;
// index++;
// }else if(compare_token("id_string")){
// index++;
//// exp.value=s[1];
//// exp.type=type_cal.NORMAL_STRING;
//
// }else if(compare_token("id_num")){
// index++;
//// exp.value=s[1];
//// exp.type=type_cal.NORMAL_NUM;
// }
// else{
// count++;
// error.error_print(1, getToken(index)[1], getToken(index)[2], getToken(index)[3]);
// index++;
// }
//
// return s[1];
// }
//ÑéÖ¤Ìõ¼þ±í´ïʽ
public Exp_cond parse_C(){
Exp_cond exp_condition=new Exp_cond();
exp_condition.left=parse_id();
exp_condition.exp_comp=parse_comp();
exp_condition.right=parse_id();
if(getToken(index)[0].equals("&")||getToken(index).equals("|")){
index++;
parse_C();
}
// index++;
return exp_condition;
}
//±È½ÏÔËËã·û
public Exp_comp parse_comp(){
String[] s=getToken(index);
Exp_comp exp_compare=(Exp_comp) getLine_Row(new Exp_comp(), s);
if (s[0].equals("<") ){
index++;
exp_compare.type=type_cal.LITTLE;
}else if(s[0].equals(">")){
index++;
exp_compare.type=type_cal.BIG;
}else if(s[0].equals(">=")){
index++;
exp_compare.type=type_cal.BIG_EQUAL;
}else if(s[0].equals("<=")){
index++;
exp_compare.type=type_cal.LITTLE_EQUAL;
}else if(s[0].equals("==")){
index++;
exp_compare.type=type_cal.EQUAL;
}
else{
if(flag_token){
String[] s1=getToken(index-1);
if(s1[0].equals(">") ||s1[0].equals(">")||s1[0].equals(">=")||s1[0].equals("<=")||s1[0].equals("==")){
flag_token=false;
}
}else{
count++;
flag_token=true;
error.error_print(1, s[1], s[2], s[3]);
index++;
}
}
return exp_compare;
}
// //Ö»ÓÃÓÚÑéÖ¤º¯Êý´«µÝµÄ²ÎÊý¶¨Òå
// public Exp_type parse_J(){
//// Exp_defvar def_var=new Exp_defvar();
// Exp_type exp_type=(Exp_type) getLine_Row(new Exp_type(),getToken(index));
// exp_type.type=parse_T();
// exp_type.Id=parse_id();
// if(exp_type.type==type_cal.NUM){
// exp_type.type=type_cal.TRANS_NUM;
// }else if(exp_type.type==type_cal.STRING){
// exp_type.type=type_cal.TRANS_STRING;
// }else{
// exp_type.type=type_cal.TRANS_BOOL;
// }
// return exp_type;
// }
//ÑéÖ¤º¯ÊýÃû
public Exp_funcname parse_N(){
Exp_funcname fun_name=new Exp_funcname();
String s[]=getToken(index);
if (s[0].equals("main")){
flag_main=true;
index++;
fun_name.name=s[1];
fun_name.line=s[2];
fun_name.row=s[3];
fun_name.type=type_cal.STRING;
}else{
if(flag_token){
if(getToken(index-1)[0].equals("main")){
flag_token=false;
}
}else{
count++;
flag_token=true;
error.error_print(2, getToken(index-1)[1], getToken(index-1)[2], getToken(index-1)[3]);
index++;
// parse_V(); ÔÝʱֻÔÊÐíÒ»¸öÖ÷º¯Êýmain
}
}
return fun_name;
}
//ÑéÖ¤¶¨Òå±äÁ¿µÄ±í´ïʽ
/*
* string a,b;
*/
public Exp_type parse_M(){
Exp_type exp_type=(Exp_type) getLine_Row(new Exp_type(),getToken(index));
exp_type.type=parse_T();
exp_type.Id=parse_M__();
return exp_type;
}
public Exp_mark parse_M__(){
Exp_mark exp=parse_id();
while(getToken(index)[0].equals(",")){
index++;
exp.set_listvalue(parse_id());
}
parse_mark(";");
return exp;
}
//ÑéÖ¤tokenµÄÀàÐÍÃû
public type_cal parse_T(){
String[] s=getToken(index);
type_cal type=type_cal.STRING;
if(s[0].equals("num")){
index++;
type=type_cal.NUM;
}
else if(s[0].equals("bool")){
index++;
type=type_cal.BOOL;
}else if(s[0].equals("string")){
index++;
}
else{
if(flag_token){
if(getToken(index-1)[0].equals("num")||getToken(index-1)[0].equals("bool")||getToken(index-1)[0].equals("string")){
flag_token=false;
}
}else{
count++;
flag_token=true;
error.error_print(4, s[1], s[2], s[3]);
index++;
}
}
return type;
}
public void print(String s){
if(flag_print){
System.out.println(s);
}
}
// //ÑéÖ¤±äÁ¿Ãû
// public void parse_(){
// String s[]=getToken(index);
// if(s[0].equals("id")){
// index++;
// }else{
// if(flag_token){
// if(getToken(index-1)[0].equals("id")){
// flag_token=false;
// }
// }else{
// count++;
// index++;
// flag_token=true;
// error.error_print(5, s[1], s[2], s[3]);
// }
// }
//
//// s=null;
// }
public Exp getLine_Row(Exp exp,String[] s){
exp.line=s[2];
exp.row=s[3];
return exp;
}
}