C语言词法分析:C#源码

今天继续研究代码解析的算法
这个是算法流程图

C语言词法分析:C#源码

有图解可能更直观一点;

以下是c#源码:

  1C语言词法分析:C#源码using System;

  2C语言词法分析:C#源码using System.IO;

  3C语言词法分析:C#源码using System.Text;

  4C语言词法分析:C#源码using System.Windows.Forms;

  5C语言词法分析:C#源码using System.Collections;

  6C语言词法分析:C#源码

  7C语言词法分析:C#源码C语言词法分析:C#源码namespace CodeFormatter C语言词法分析:C#源码{

  8C语言词法分析:C#源码C语言词法分析:C#源码  /**//// <summary>

  9C语言词法分析:C#源码  /// CodeFormatterFactory 的摘要说明。

 10C语言词法分析:C#源码  /// c 代码解析,不支持中文

 11C语言词法分析:C#源码  /// </summary>

 12C语言词法分析:C#源码C语言词法分析:C#源码  public class CodeFormatterFactory C语言词法分析:C#源码{

 13C语言词法分析:C#源码C语言词法分析:C#源码    /**//*源代码*/

 14C语言词法分析:C#源码    private string sourceCode = "";

 15C语言词法分析:C#源码

 16C语言词法分析:C#源码C语言词法分析:C#源码    /**//*C语言所有关键字,共32个*/

 17C语言词法分析:C#源码    ArrayList KeyWordList = new ArrayList();

 18C语言词法分析:C#源码

 19C语言词法分析:C#源码C语言词法分析:C#源码    /**//*运算、限界符*/

 20C语言词法分析:C#源码    ArrayList LimitList = new ArrayList();

 21C语言词法分析:C#源码

 22C语言词法分析:C#源码C语言词法分析:C#源码    /**//*常量表*/

 23C语言词法分析:C#源码    ArrayList ConstList = new ArrayList();

 24C语言词法分析:C#源码

 25C语言词法分析:C#源码C语言词法分析:C#源码    /**//*标识符*/

 26C语言词法分析:C#源码    ArrayList IdentifierList = new ArrayList();

 27C语言词法分析:C#源码

 28C语言词法分析:C#源码C语言词法分析:C#源码    /**//*输出*/

 29C语言词法分析:C#源码    ArrayList OutputList = new ArrayList();

 30C语言词法分析:C#源码

 31C语言词法分析:C#源码C语言词法分析:C#源码    public CodeFormatterFactory() C语言词法分析:C#源码{

 32C语言词法分析:C#源码      //

 33C语言词法分析:C#源码      // TODO: 在此处添加构造函数逻辑

 34C语言词法分析:C#源码      //

 35C语言词法分析:C#源码      init();

 36C语言词法分析:C#源码    }

 37C语言词法分析:C#源码

 38C语言词法分析:C#源码C语言词法分析:C#源码    public string SourceCodeC语言词法分析:C#源码{

 39C语言词法分析:C#源码C语言词法分析:C#源码      getC语言词法分析:C#源码{return this.sourceCode;}

 40C语言词法分析:C#源码C语言词法分析:C#源码      setC语言词法分析:C#源码{this.sourceCode =value;}

 41C语言词法分析:C#源码    }

 42C语言词法分析:C#源码

 43C语言词法分析:C#源码C语言词法分析:C#源码    public string ParseMessagesC语言词法分析:C#源码{

 44C语言词法分析:C#源码C语言词法分析:C#源码      getC语言词法分析:C#源码{

 45C语言词法分析:C#源码        string pm = "";

 46C语言词法分析:C#源码

 47C语言词法分析:C#源码        IEnumerator ie = this.OutputList.GetEnumerator();

 48C语言词法分析:C#源码        while ( ie.MoveNext() )

 49C语言词法分析:C#源码          pm += ie.Current.ToString() + "\r\n";

 50C语言词法分析:C#源码        return pm;

 51C语言词法分析:C#源码      }

 52C语言词法分析:C#源码    }

 53C语言词法分析:C#源码

 54C语言词法分析:C#源码C语言词法分析:C#源码    private void init() C语言词法分析:C#源码{

 55C语言词法分析:C#源码C语言词法分析:C#源码      /**//*C语言所有关键字,共32个*/

 56C语言词法分析:C#源码C语言词法分析:C#源码      string[] key=new string[]C语言词法分析:C#源码{" ","auto","break","case","char","const","continue","default","do","double",

 57C语言词法分析:C#源码                                 "else","enum","extern","float","for","goto","if","int","long","register",

 58C语言词法分析:C#源码                                 "return","short","signed","sizeof","static","struct","switch","typedef",

 59C语言词法分析:C#源码                                 "union","unsigned","void","volatile","while"};

 60C语言词法分析:C#源码C语言词法分析:C#源码      /**//*运算、限界符*/

 61C语言词法分析:C#源码C语言词法分析:C#源码      string[] limit=new string[]C语言词法分析:C#源码{" ","(",")","[","]","->",".","!","++","--","&","~",

 62C语言词法分析:C#源码                                   "*","/","%","+","-","<<",">>","<","<=",">",">=","==","!=","&&","||",

 63C语言词法分析:C#源码                                   "=","+=","-=","*=","/=",",",";","{","}","#","_","'"};

 64C语言词法分析:C#源码

 65C语言词法分析:C#源码      this.KeyWordList.Clear();

 66C语言词法分析:C#源码      this.KeyWordList.TrimToSize();

;i<key.Length;i++)

 68C语言词法分析:C#源码        this.KeyWordList.Add(key[i]);

 69C语言词法分析:C#源码

 70C语言词法分析:C#源码      this.LimitList.Clear();

 71C语言词法分析:C#源码      this.LimitList.TrimToSize();

;i<limit.Length;i++)

 73C语言词法分析:C#源码        this.LimitList.Add(limit[i]);

 74C语言词法分析:C#源码

 75C语言词法分析:C#源码      this.ConstList.Clear();

 76C语言词法分析:C#源码      this.ConstList.TrimToSize();

 77C语言词法分析:C#源码

 78C语言词法分析:C#源码      this.IdentifierList.Clear();

 79C语言词法分析:C#源码      this.IdentifierList.TrimToSize();

 80C语言词法分析:C#源码

 81C语言词法分析:C#源码      this.OutputList.Clear();

 82C语言词法分析:C#源码      this.OutputList.TrimToSize();

 83C语言词法分析:C#源码    }

 84C语言词法分析:C#源码

 85C语言词法分析:C#源码C语言词法分析:C#源码    /**//*******************************************

 86C语言词法分析:C#源码    * 十进制转二进制函数

 87C语言词法分析:C#源码    *******************************************/

 88C语言词法分析:C#源码C语言词法分析:C#源码    private string dtb(string buf)C语言词法分析:C#源码{

];

 90C语言词法分析:C#源码      string binary = "";

;

 92C语言词法分析:C#源码

 93C语言词法分析:C#源码C语言词法分析:C#源码      /**//*先将字符转化为十进制数*/

 94C语言词法分析:C#源码C语言词法分析:C#源码      tryC语言词法分析:C#源码{

 95C语言词法分析:C#源码        val = Convert.ToInt32(buf);

 96C语言词法分析:C#源码C语言词法分析:C#源码      }catchC语言词法分析:C#源码{

;

 98C语言词法分析:C#源码      }

 99C语言词法分析:C#源码

C语言词法分析:C#源码{

C语言词法分析:C#源码        return(val.ToString());

C语言词法分析:C#源码      }

C语言词法分析:C#源码

;

C语言词法分析:C#源码{

;

;

C语言词法分析:C#源码      }

C语言词法分析:C#源码

C语言词法分析:C#源码      binary = "";

;j++)

);

C语言词法分析:C#源码

C语言词法分析:C#源码      return(binary);

C语言词法分析:C#源码    }

C语言词法分析:C#源码

C语言词法分析:C#源码C语言词法分析:C#源码    /**//*******************************************

C语言词法分析:C#源码    * 根据不同命令查表或造表函数

C语言词法分析:C#源码    *******************************************/

C语言词法分析:C#源码C语言词法分析:C#源码    private int find(string buf,int type,int command)C语言词法分析:C#源码{     

;

C语言词法分析:C#源码      string temp;

C语言词法分析:C#源码

C语言词法分析:C#源码      IEnumerator ie = null;

C语言词法分析:C#源码      ArrayList al = null;

C语言词法分析:C#源码C语言词法分析:C#源码      switch(type)C语言词法分析:C#源码{

://关键字表

C语言词法分析:C#源码          ie = this.KeyWordList.GetEnumerator();

C语言词法分析:C#源码          break;

://标识符表

C语言词法分析:C#源码          ie = this.IdentifierList.GetEnumerator();

C语言词法分析:C#源码          break;

://常数表

C语言词法分析:C#源码          ie = this.ConstList.GetEnumerator();

C语言词法分析:C#源码          break;

://运算、限界符表

C语言词法分析:C#源码          ie = this.LimitList.GetEnumerator();

C语言词法分析:C#源码          break;

C语言词法分析:C#源码      }            

C语言词法分析:C#源码

C语言词法分析:C#源码      if(ie!=null)

C语言词法分析:C#源码C语言词法分析:C#源码      while (ie.MoveNext())C语言词法分析:C#源码{

C语言词法分析:C#源码        temp = ie.Current.ToString();

C语言词法分析:C#源码C语言词法分析:C#源码        if(temp.Trim().ToLower()==buf.Trim().ToLower())C语言词法分析:C#源码{

C语言词法分析:C#源码          return number;

C语言词法分析:C#源码        }

C语言词法分析:C#源码        number ++;

C语言词法分析:C#源码      }

C语言词法分析:C#源码      

)C语言词法分析:C#源码{

C语言词法分析:C#源码C语言词法分析:C#源码        /**//*找不到,当只需查表,返回0,否则还需造表*/

;

C语言词法分析:C#源码      }

C语言词法分析:C#源码

C语言词法分析:C#源码C语言词法分析:C#源码      switch(type)C语言词法分析:C#源码{

: al = this.KeyWordList;break;

: al = this.IdentifierList;break;

: al = this.ConstList;break;

: al = this.LimitList;break;

C语言词法分析:C#源码      }

C语言词法分析:C#源码      if(al!=null)

C语言词法分析:C#源码        al.Add(buf);

C语言词法分析:C#源码

;

C语言词法分析:C#源码    }

C语言词法分析:C#源码C语言词法分析:C#源码    /**//*******************************************

C语言词法分析:C#源码    * 数字串处理函数

C语言词法分析:C#源码    *******************************************/

C语言词法分析:C#源码C语言词法分析:C#源码    private void cs_manage(string buffer)C语言词法分析:C#源码{

C语言词法分析:C#源码      string binary = dtb(buffer);

);

C语言词法分析:C#源码      this.OutputList.Add(String.Format("{0}\t\t\t3\t\t\t{1}",buffer,result));

C语言词法分析:C#源码    }

C语言词法分析:C#源码

C语言词法分析:C#源码C语言词法分析:C#源码    /**//*******************************************

C语言词法分析:C#源码    * 字符串处理函数 

C语言词法分析:C#源码    *******************************************/

C语言词法分析:C#源码C语言词法分析:C#源码    private void ch_manage(string buffer) C语言词法分析:C#源码{

);

)C语言词法分析:C#源码{

C语言词法分析:C#源码        this.OutputList.Add(String.Format("{0}\t\t\t1\t\t\t{1}",buffer,result));

C语言词法分析:C#源码C语言词法分析:C#源码      }elseC语言词法分析:C#源码{

);

C语言词法分析:C#源码        this.OutputList.Add(String.Format("{0}\t\t\t2\t\t\t{1}",buffer,result));

C语言词法分析:C#源码      }

C语言词法分析:C#源码    }

C语言词法分析:C#源码

C语言词法分析:C#源码C语言词法分析:C#源码    /**//*******************************************

C语言词法分析:C#源码    * 出错处理函数

C语言词法分析:C#源码    *******************************************/

C语言词法分析:C#源码C语言词法分析:C#源码    private void er_manage(char error,int lineno) C语言词法分析:C#源码{

C语言词法分析:C#源码      this.OutputList.Add(String.Format("错误关键字: {0} ,所在行: {1}",error,lineno));

C语言词法分析:C#源码    }

C语言词法分析:C#源码

C语言词法分析:C#源码C语言词法分析:C#源码    /**//*******************************************

C语言词法分析:C#源码    * 转换Char数组为string

C语言词法分析:C#源码    ******************************************/

C语言词法分析:C#源码C语言词法分析:C#源码    private string joinString(char[] array,int Length)C语言词法分析:C#源码{

C语言词法分析:C#源码      string s = "";

)

;i<Length;i++)C语言词法分析:C#源码{

C语言词法分析:C#源码C语言词法分析:C#源码          if(array[i]!='\0') C语言词法分析:C#源码{

C语言词法分析:C#源码            s+=array[i];

C语言词法分析:C#源码C语言词法分析:C#源码          }elseC语言词法分析:C#源码{

C语言词法分析:C#源码            break;

C语言词法分析:C#源码          }

C语言词法分析:C#源码        }

C语言词法分析:C#源码      return s;

C语言词法分析:C#源码    }

C语言词法分析:C#源码

C语言词法分析:C#源码C语言词法分析:C#源码    private char getchc(ref int n)C语言词法分析:C#源码{

C语言词法分析:C#源码      char[] c = sourceCode.ToCharArray();

C语言词法分析:C#源码C语言词法分析:C#源码      if(n<c.Length)C语言词法分析:C#源码{

C语言词法分析:C#源码        char r = c[n];      

C语言词法分析:C#源码        n++;

C语言词法分析:C#源码        return r;

C语言词法分析:C#源码      }

];

C语言词法分析:C#源码    }

C语言词法分析:C#源码C语言词法分析:C#源码    /**//*******************************************

C语言词法分析:C#源码    * 扫描程序

C语言词法分析:C#源码    ********************************************/

C语言词法分析:C#源码C语言词法分析:C#源码    public void Parse() C语言词法分析:C#源码{

C语言词法分析:C#源码      //StreamWriter fpout = null;

C语言词法分析:C#源码      char ch ;

;

;

];

C语言词法分析:C#源码      string word= "";

C语言词法分析:C#源码

C语言词法分析:C#源码C语言词法分析:C#源码      /**//*按字符依次扫描源程序,直至结束*/

;

C语言词法分析:C#源码

)C语言词法分析:C#源码{

;

C语言词法分析:C#源码        ch = getchc(ref n);

C语言词法分析:C#源码C语言词法分析:C#源码        /**//*以字母开头*/

C语言词法分析:C#源码C语言词法分析:C#源码        if(((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<='z'))||(ch=='_')) C语言词法分析:C#源码{                    

'))) C语言词法分析:C#源码{

C语言词法分析:C#源码            array[i++]=ch;

C语言词法分析:C#源码            ch = getchc(ref n);

C语言词法分析:C#源码          }

C语言词法分析:C#源码          array[i++] = '\0';

C语言词法分析:C#源码          word = joinString(array,array.Length);

C语言词法分析:C#源码          ch_manage(word);

C语言词法分析:C#源码          if(n<sourceCode.Length)n--;

') C语言词法分析:C#源码{

C语言词法分析:C#源码C语言词法分析:C#源码          /**//*以数字开头*/

') C语言词法分析:C#源码{

C语言词法分析:C#源码            array[i++]=ch;

C语言词法分析:C#源码            ch = getchc(ref n);

C语言词法分析:C#源码          }

C语言词法分析:C#源码          array[i++] = '\0';

C语言词法分析:C#源码          word=joinString(array,array.Length);

C语言词法分析:C#源码          cs_manage(word);

C语言词法分析:C#源码          if(n<sourceCode.Length)n--;

C语言词法分析:C#源码        }

C语言词法分析:C#源码        else if((ch==' ')||(ch=='\t'))

C语言词法分析:C#源码C语言词法分析:C#源码          /**//*消除空格符和水平制表符*/

C语言词法分析:C#源码          ;

C语言词法分析:C#源码        else if(ch=='\n')

C语言词法分析:C#源码C语言词法分析:C#源码          /**//*消除回车并记录行数*/

C语言词法分析:C#源码          line++;

C语言词法分析:C#源码C语言词法分析:C#源码        else if(ch=='/') C语言词法分析:C#源码{

C语言词法分析:C#源码C语言词法分析:C#源码          /**//*消除注释*/                          

C语言词法分析:C#源码          ch = getchc(ref n);

C语言词法分析:C#源码C语言词法分析:C#源码          if(ch=='=') C语言词法分析:C#源码{

C语言词法分析:C#源码C语言词法分析:C#源码            /**//*判断是否为‘/=’符号*/

C语言词法分析:C#源码            this.OutputList.Add(String.Format("/=\t\t\t4\t\t\t32"));

C语言词法分析:C#源码          }

C语言词法分析:C#源码C语言词法分析:C#源码          else if(ch!='*') C语言词法分析:C#源码{

C语言词法分析:C#源码C语言词法分析:C#源码            /**//*若为除号,写入输出*/

C语言词法分析:C#源码            this.OutputList.Add(String.Format("/\t\t\t4\t\t\t13"));

C语言词法分析:C#源码            n--;

C语言词法分析:C#源码C语言词法分析:C#源码          } else if(ch=='*') C语言词法分析:C#源码{

C语言词法分析:C#源码C语言词法分析:C#源码            /**//*若为注释的开始,消除包含在里面的所有字符*/

;

C语言词法分析:C#源码            ch = getchc(ref n);

C语言词法分析:C#源码{

C语言词法分析:C#源码C语言词法分析:C#源码              /**//*当扫描到‘*’且紧接着下一个字符为‘/’才是注释的结束*/

;

C语言词法分析:C#源码              while(ch!='*')

C语言词法分析:C#源码                ch = getchc(ref n);

C语言词法分析:C#源码              count++;

C语言词法分析:C#源码              ch = getchc(ref n);

C语言词法分析:C#源码              if(ch=='/')

C语言词法分析:C#源码                count++;

C语言词法分析:C#源码              else

C语言词法分析:C#源码                ch = getchc(ref n);

C语言词法分析:C#源码            }

C语言词法分析:C#源码          }

C语言词法分析:C#源码        }

C语言词法分析:C#源码C语言词法分析:C#源码        else if(ch=='"') C语言词法分析:C#源码{

C语言词法分析:C#源码C语言词法分析:C#源码          /**//*消除包含在双引号中的字符串常量*/

C语言词法分析:C#源码          this.OutputList.Add(String.Format("{0}\t\t\t4\t\t\t37",ch));

C语言词法分析:C#源码          while(ch!='"')

C语言词法分析:C#源码            ch = getchc(ref n);

C语言词法分析:C#源码          this.OutputList.Add(String.Format("{0}\t\t\t4\t\t\t37",ch));

C语言词法分析:C#源码        }

C语言词法分析:C#源码C语言词法分析:C#源码        else C语言词法分析:C#源码{

C语言词法分析:C#源码C语言词法分析:C#源码          /**//*首字符为其它字符,即运算限界符或非法字符*/

]=ch;

C语言词法分析:C#源码C语言词法分析:C#源码          /**//*再读入下一个字符,判断是否为双字符运算、限界符*/

C语言词法分析:C#源码          ch = getchc(ref n);

C语言词法分析:C#源码C语言词法分析:C#源码          /**//*若该字符非结束符*/

C语言词法分析:C#源码C语言词法分析:C#源码          if(n<sourceCode.Length) C语言词法分析:C#源码{

]=ch;

] = '\0';

);

); /**//*先检索是否为双字符运算、限界符*/

C语言词法分析:C#源码{

C语言词法分析:C#源码C语言词法分析:C#源码              /**//*若不是*/    

] = '\0';

);

);      

C语言词法分析:C#源码C语言词法分析:C#源码              /**//*检索是否为单字符运算、限界符*/

C语言词法分析:C#源码{

C语言词法分析:C#源码C语言词法分析:C#源码                /**//*若还不是,则为非法字符*/

],line);

C语言词法分析:C#源码                errorno++;

C语言词法分析:C#源码                n--;

C语言词法分析:C#源码              }

C语言词法分析:C#源码C语言词法分析:C#源码              else C语言词法分析:C#源码{

C语言词法分析:C#源码C语言词法分析:C#源码                /**//*若为单字符运算、限界符,写入输出并将扫描指针回退一个字符*/

C语言词法分析:C#源码                this.OutputList.Add(String.Format("{0}\t\t\t4\t\t\t{1}\t",word,result));

C语言词法分析:C#源码                n--;

C语言词法分析:C#源码              }

C语言词法分析:C#源码            }

C语言词法分析:C#源码C语言词法分析:C#源码            else C语言词法分析:C#源码{

C语言词法分析:C#源码C语言词法分析:C#源码              /**//*若为双字符运算、限界符,写输出*/

C语言词法分析:C#源码              this.OutputList.Add(String.Format("{0}\t\t\t4\t\t\t{1}",word,result));

C语言词法分析:C#源码            }

C语言词法分析:C#源码          }

C语言词法分析:C#源码C语言词法分析:C#源码          else C语言词法分析:C#源码{

C语言词法分析:C#源码C语言词法分析:C#源码            /**//*若读入的下一个字符为结束符*/

] = '\0';

);

C语言词法分析:C#源码C语言词法分析:C#源码            /**//*只考虑是否为单字符运算、限界符*/

);

C语言词法分析:C#源码C语言词法分析:C#源码            /**//*若不是,转出错处理*/

)

],line);

C语言词法分析:C#源码C语言词法分析:C#源码            else C语言词法分析:C#源码{

C语言词法分析:C#源码C语言词法分析:C#源码              /**//*若是,写输出*/

C语言词法分析:C#源码              this.OutputList.Add(String.Format("{0}\t\t\t4\t\t\t{1}",word,result));

C语言词法分析:C#源码            }

C语言词法分析:C#源码          }

C语言词法分析:C#源码        }

C语言词法分析:C#源码        ch = getchc(ref n);

C语言词法分析:C#源码      }

C语言词法分析:C#源码C语言词法分析:C#源码      /**//*报告错误字符个数*/

C语言词法分析:C#源码      this.OutputList.Add(String.Format("\n共有 {0} 个错误.\n",errorno));

C语言词法分析:C#源码    }

C语言词法分析:C#源码

C语言词法分析:C#源码  }

C语言词法分析:C#源码}

C语言词法分析:C#源码

代码可能似曾相识,因为我是参考的一篇C的代码;

这里下载工程源码(带C代码) 

2005年4月22日 S.F.

出处:http://www.cnblogs.com/chinasf/archive/2005/04/22/143449.html

上一篇:简单的词法分析和语法分析(C++实现,CodeBlocks+GCC编译)


下一篇:python_遇到问题