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

using System;  
using System.IO;  
using System.Text;  
using System.Windows.Forms;  
using System.Collections;  
  
namespace CodeFormatter  
{  
    /// <summary>   
    /// CodeFormatterFactory 的摘要说明。   
    /// c 代码解析,不支持中文   
    /// </summary>   
    public class CodeFormatterFactory
    {  
        /*源代码*/  
        private string sourceCode = "";
  
        /*C语言所有关键字,共32个*/
        ArrayList KeyWordList = new ArrayList();  
  
        /*运算、限界符*/
        ArrayList LimitList = new ArrayList();  
  
        /*常量表*/
        ArrayList ConstList = new ArrayList();  
  
        /*标识符*/
        ArrayList IdentifierList = new ArrayList();  
  
        /*输出*/
        ArrayList OutputList = new ArrayList();  
  
        public CodeFormatterFactory()  
        {  
            //   
            // TODO: 在此处添加构造函数逻辑   
            //   
            init();  
        }  
  
        public string SourceCode  
        {  
            get { return this.sourceCode; }  
            set { this.sourceCode = value; }  
        }  
  
        public string ParseMessages  
        {  
            get  
            {  
                string pm = "";  
  
                IEnumerator ie = this.OutputList.GetEnumerator();  
                while (ie.MoveNext())  
                    pm += ie.Current.ToString() + "/r/n";  
                return pm;  
            }  
        }  
  
        private void init()  
        {  
            /*C语言所有关键字,共32个*/
            string[] key = new string[]{" ","auto","break","case","char","const","continue","default","do","double",   
                                 "else","enum","extern","float","for","goto","if","int","long","register",   
                                 "return","short","signed","sizeof","static","struct","switch","typedef",   
                                 "union","unsigned","void","volatile","while"};  
            /*运算、限界符*/  
            string[] limit = new string[]{" ","(",")","[","]","->",".","!","++","--","&","~",   
                                   "*","/","%","+","-","<<",">>","<","<=",">",">=","==","!=","&&","||",   
                                   "=","+=","-=","*=","/=",",",";","{","}","#","_","'"};  
  
            this.KeyWordList.Clear();  
            this.KeyWordList.TrimToSize();  
            for (int i = 1; i < key.Length; i++)  
                this.KeyWordList.Add(key[i]);  
  
            this.LimitList.Clear();  
            this.LimitList.TrimToSize();  
            for (int i = 1; i < limit.Length; i++)  
                this.LimitList.Add(limit[i]);  
  
            this.ConstList.Clear();  
            this.ConstList.TrimToSize();  
  
            this.IdentifierList.Clear();  
            this.IdentifierList.TrimToSize();  
  
            this.OutputList.Clear();  
            this.OutputList.TrimToSize();  
        }  
  
        /*******************************************  
        * 十进制转二进制函数  
        *******************************************/
        private string dtb(string buf)  
        {  
            int[] temp = new int[20];  
            string binary = "";  
            int val = 0, i = 0;  
  
            /*先将字符转化为十进制数*/
            try  
            {  
                val = Convert.ToInt32(buf);  
            }  
            catch  
            {  
                val = 0;  
            }  
  
            if (val == 0)  
            {  
                return (val.ToString());  
            }  
  
            i = 0;  
            while (val != 0)  
            {  
                temp[i++] = val % 2;  
                val /= 2;  
            }  
  
            binary = "";  
            for (int j = 0; j <= i - 1; j++)  
                binary += (char) (temp[i - j - 1] + 48);  
  
            return (binary);  
        }  
  
        /*******************************************  
        * 根据不同命令查表或造表函数  
        *******************************************/
        private int find(string buf, int type, int command)  
        {  
            int number = 0;  
            string temp;  
  
            IEnumerator ie = null;  
            ArrayList al = null;  
            switch (type)  
            {  
            case 1://关键字表   
                ie = this.KeyWordList.GetEnumerator();  
                break;  
            case 2://标识符表   
                ie = this.IdentifierList.GetEnumerator();  
                break;  
            case 3://常数表   
                ie = this.ConstList.GetEnumerator();  
                break;  
            case 4://运算、限界符表   
                ie = this.LimitList.GetEnumerator();  
                break;  
            }  
  
            if (ie != null)  
                while (ie.MoveNext())  
                {  
                    temp = ie.Current.ToString();  
                    if (temp.Trim().ToLower() == buf.Trim().ToLower())  
                    {  
                        return number;  
                    }  
                    number++;  
                }  
  
            if (command == 1)  
            {  
                /*找不到,当只需查表,返回0,否则还需造表*/
                return 0;  
            }  
  
            switch (type)  
            {  
            case 1:  
                al = this.KeyWordList;  
                break;  
            case 2:  
                al = this.IdentifierList;  
                break;  
            case 3:  
                al = this.ConstList;  
                break;  
            case 4:  
                al = this.LimitList;  
                break;  
            }  
            if (al != null)  
                al.Add(buf);  
  
            return number + 1;  
        }  
        /*******************************************  
        * 数字串处理函数  
        *******************************************/
        private void cs_manage(string buffer)  
        {  
            string binary = dtb(buffer);  
            int result = find(binary, 3, 2);  
            this.OutputList.Add(String.Format("{0}/t/t/t3/t/t/t{1}", buffer, result));  
        }  
  
        /*******************************************  
        * 字符串处理函数   
        *******************************************/
        private void ch_manage(string buffer)  
        {  
            int result = find(buffer, 1, 1);  
            if (result != 0)  
            {  
                this.OutputList.Add(String.Format("{0}/t/t/t1/t/t/t{1}", buffer, result));  
            }  
            else  
            {  
                result = find(buffer, 2, 2);  
                this.OutputList.Add(String.Format("{0}/t/t/t2/t/t/t{1}", buffer, result));  
            }  
        }  
  
        /*******************************************  
        * 出错处理函数  
        *******************************************/
        private void er_manage(char error, int lineno)  
        {  
            this.OutputList.Add(String.Format("错误关键字: {0} ,所在行: {1}", error, lineno));  
        }  
  
        /*******************************************  
        * 转换Char数组为string  
        ******************************************/  
        private string joinString(char[] array, int Length)  
        {  
            string s = "";  
            if (array.Length > 0)  
                for (int i = 0; i < Length; i++)  
                {  
                    if (array[i] != '/0')  
                    {  
                        s += array[i];  
                    }  
                    else  
                    {  
                        break;  
                    }  
                }  
            return s;  
        }  
  
        private char getchc(ref int n)  
        {  
            char[] c = sourceCode.ToCharArray();  
            if (n < c.Length)  
            {  
                char r = c[n];  
                n++;  
                return r;  
            }  
            return sourceCode[sourceCode.Length - 1];  
        }  
        /*******************************************  
        * 扫描程序  
        ********************************************/  
        public void Parse()  
        {  
            //StreamWriter fpout = null;   
            char ch;  
            int i = 0, line = 1;  
            int count, result, errorno = 0;  
            char[] array = new char[30];  
            string word = "";  
  
            /*按字符依次扫描源程序,直至结束*/  
            int n = 0;  
  
            while (n < sourceCode.Length - 1)  
            {  
                i = 0;  
                ch = getchc(ref n);  
                /*以字母开头*/  
                if (((ch >= 'A') && (ch <= 'Z')) || ((ch >= 'a') && (ch <= 'z')) || (ch == '_'))  
                {  
                    while (((ch >= 'A') && (ch <= 'Z')) || ((ch >= 'a') && (ch <= 'z')) || (ch == '_') || ((ch >= '0') && (ch <= '9')))  
                    {  
                        array[i++] = ch;  
                        ch = getchc(ref n);  
                    }  
                    array[i++] = '/0';  
                    word = joinString(array, array.Length);  
                    ch_manage(word);  
                    if (n < sourceCode.Length)  
                        n--;  
                }  
                else if (ch >= '0' && ch <= '9')  
                {  
                    /*以数字开头*/  
                    while (ch >= '0' && ch <= '9')  
                    {  
                        array[i++] = ch;  
                        ch = getchc(ref n);  
                    }  
                    array[i++] = '/0';  
                    word = joinString(array, array.Length);  
                    cs_manage(word);  
                    if (n < sourceCode.Length)  
                        n--;  
                }  
                else if ((ch == ' ') || (ch == '/t'))  
                    /*消除空格符和水平制表符*/  
                    ;  
                else if (ch == '/n')  
                    /*消除回车并记录行数*/  
                    line++;  
                else if (ch == '/')  
                {  
                    /*消除注释*/  
                    ch = getchc(ref n);  
                    if (ch == '=')  
                    {  
                        /*判断是否为‘/=’符号*/  
                        this.OutputList.Add(String.Format("/=/t/t/t4/t/t/t32"));  
                    }  
                    else if (ch != '*')  
                    {  
                        /*若为除号,写入输出*/  
                        this.OutputList.Add(String.Format("//t/t/t4/t/t/t13"));  
                        n--;  
                    }  
                    else if (ch == '*')  
                    {  
                        /*若为注释的开始,消除包含在里面的所有字符*/  
                        count = 0;  
                        ch = getchc(ref n);  
                        while (count != 2)  
                        {  
                            /*当扫描到‘*’且紧接着下一个字符为‘/’才是注释的结束*/  
                            count = 0;  
                            while (ch != '*')  
                                ch = getchc(ref n);  
                            count++;  
                            ch = getchc(ref n);  
                            if (ch == '/')  
                                count++;  
                            else  
                                ch = getchc(ref n);  
                        }  
                    }  
                }  
                else if (ch == '"')  
                {  
                    /*消除包含在双引号中的字符串常量*/  
                    this.OutputList.Add(String.Format("{0}/t/t/t4/t/t/t37", ch));  
                    while (ch != '"')  
                        ch = getchc(ref n);  
                    this.OutputList.Add(String.Format("{0}/t/t/t4/t/t/t37", ch));  
                }  
                else  
                {  
                    /*首字符为其它字符,即运算限界符或非法字符*/  
                    array[0] = ch;  
                    /*再读入下一个字符,判断是否为双字符运算、限界符*/  
                    ch = getchc(ref n);  
                    /*若该字符非结束符*/  
                    if (n < sourceCode.Length)  
                    {  
                        array[1] = ch;  
                        array[2] = '/0';  
                        word = joinString(array, 2);  
                        result = find(word, 4, 1); /*先检索是否为双字符运算、限界符*/  
                        if (result == 0)  
                        {  
                            /*若不是*/  
                            array[2] = '/0';  
                            word = joinString(array, 1);  
                            result = find(word, 4, 1);  
                            /*检索是否为单字符运算、限界符*/  
                            if (result == 0)  
                            {  
                                /*若还不是,则为非法字符*/  
                                er_manage(array[0], line);  
                                errorno++;  
                                n--;  
                            }  
                            else  
                            {  
                                /*若为单字符运算、限界符,写入输出并将扫描指针回退一个字符*/  
                                this.OutputList.Add(String.Format("{0}/t/t/t4/t/t/t{1}/t", word, result));  
                                n--;  
                            }  
                        }  
                        else  
                        {  
                            /*若为双字符运算、限界符,写输出*/  
                            this.OutputList.Add(String.Format("{0}/t/t/t4/t/t/t{1}", word, result));  
                        }  
                    }  
                    else  
                    {  
                        /*若读入的下一个字符为结束符*/  
                        array[2] = '/0';  
                        word = joinString(array, 1);  
                        /*只考虑是否为单字符运算、限界符*/  
                        result = find(word, 4, 1);  
                        /*若不是,转出错处理*/  
                        if (result == 0)  
                            er_manage(array[0], line);  
                        else  
                        {  
                            /*若是,写输出*/  
                            this.OutputList.Add(String.Format("{0}/t/t/t4/t/t/t{1}", word, result));  
                        }  
                    }  
                }  
                ch = getchc(ref n);  
            }  
            /*报告错误字符个数*/  
            this.OutputList.Add(String.Format("/n共有 {0} 个错误./n", errorno));
        }


    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值