⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.cs

📁 c#写的词法分析
💻 CS
📖 第 1 页 / 共 2 页
字号:
Rem(注释)        

Integer(整数)  Long(长整数)  Single(单精度小数) Double(双精度,小数)   Boolean(布尔)  String(字符串,文字)*/

//每循环一次,把一个单词归于一类,即前面加上一个数字。 
for(int i=0;i<stringArray.Length;i++) 
{ 
//关键字   
if( stringArray[i] == "main" 
|| stringArray[i] == "int"
|| stringArray[i] == "var" 
|| stringArray[i] == "fload"
|| stringArray[i] == "double"   
|| stringArray[i] == "void"
|| stringArray[i] == "char"
|| stringArray[i] == "class"
|| stringArray[i] == "const"  
|| stringArray[i] == "bool" 
|| stringArray[i] == "float" 
|| stringArray[i] == "printf" 
|| stringArray[i] == "if" 
|| stringArray[i] == "for" 
|| stringArray[i] == "while" 
|| stringArray[i] == "do" 
|| stringArray[i] == "return" 
|| stringArray[i] == "break" 
|| stringArray[i] == "continue") 
{ 
twoArray[0,j] = "1"; 
twoArray[1,j] = stringArray[i]; 
this.oneArrayToTwo(ref twoArray,ref j); 
} 
//运算符   
else 
if( stringArray[i] == "+" 
|| stringArray[i] == "-" 
|| stringArray[i] == "*" 
|| stringArray[i] == "/" 
|| stringArray[i] == ">" 
|| stringArray[i] == "<" 
|| stringArray[i] == ">=" 
|| stringArray[i] == "<=" 
|| stringArray[i] == "!=" 
|| stringArray[i] == "==" 
|| stringArray[i] == "++" 
|| stringArray[i] == "--" 
|| stringArray[i] == "=") 
{ 
twoArray[0,j] = "2"; 
twoArray[1,j] = stringArray[i]; 
this.oneArrayToTwo(ref twoArray,ref j); 
} 
//分隔符 3 
else 
if( stringArray[i] == "(" 
|| stringArray[i] == ")" 
|| stringArray[i] == "{" 
|| stringArray[i] == "}" 
|| stringArray[i] == "[" 
|| stringArray[i] == "]" 
|| stringArray[i] == "," 
|| stringArray[i] == ";" 
|| stringArray[i] == ":" 
|| stringArray[i] == "\"" 
|| stringArray[i] == "/*" 
|| stringArray[i] == "*/") 
{ 
twoArray[0,j] = "3"; 
twoArray[1,j] = stringArray[i]; 
this.oneArrayToTwo(ref twoArray,ref j); 
} 
//数字 4 
else 
if( stringArray[i].ToCharArray()[0] >='0' && 
stringArray[i].ToCharArray()[0] <= '9') 
{ 
twoArray[0,j] = "4";//数字 
twoArray[1,j] = stringArray[i]; 
this.oneArrayToTwo(ref twoArray,ref j); 
} 
//其它 5(变量等) 
else 
{ 
twoArray[0,j] = "5"; 
twoArray[1,j] = stringArray[i]; 
this.oneArrayToTwo(ref twoArray,ref j); 
} 
} 
return twoArray; 
}

private void button3_Click(object sender, EventArgs e)
{
   
    WordAnalyse();
    StringBuilder sb = new StringBuilder();
    foreach (string item in strList)
    {
        
        
            sb.Append(item).Append("\n" );
       
        
    }
    richTextBox3.Text = sb.ToString();
}
    int j = 0;
StringBuilder sbError = new StringBuilder();
private void GramAnalyse()
{
    sbError.Append("行").Append("\t").Append("错误信息!").Append("\n");
    if (strList[j] != "begin")
    {
        sbError.Append(rowList[j] + 1).Append("\t").Append("开始应为begin").Append("\n");
    }

    j++;
    if (Sentence())
    {
        if (strList[j] != "end")
            sbError.Append(rowList[j] + 1).Append("\t").Append("应以end结束").Append("\n");
    }
    //else
    //sbError.Append(rowList[j] + 1).Append("\t").Append("语句出错!").Append("\n");
}


private bool Sentence()//语句
{
    if (fzSentence())
        return true;

    if (tjSentence())
        return true;
    else return false;

}
private bool fzSentence()//赋值语句
{
    if (!Variable())//变量
        return false;

    j++;
    if (strList[j] != ":=")//:=
    {
        return false;
    }

    j++;
    if (expression()) return true;//表达式
    else
    {
        sbError.Append(rowList[j] + 1).Append("\t").Append("表达式出错!").Append("\n");
        return false;
    }


}

private bool tjSentence()//条件语句
{
    if (strList[j] != "if")//if
        return false;

    j++;
    if (!expression())//表达式
    {
        sbError.Append(rowList[j] + 1).Append("\t").Append("表达式出错!").Append("\n");
        return false;
    }

    if (strList[j] != "then")//then   
    {
        sbError.Append(rowList[j] + 1).Append("\t").Append("应为then!").Append("\n");
        return false;
    }

    j++;
    if (Sentence()) return true;//语句
    else
    {
        return false;
    }

}
private bool expression()//表达式
{
    if (!Variable()) //变量   
        return false;
    j++;
    while (strList[j] == "+")//+
    {
        j++;
        if (!expression())//表达式
        {
            j--;
            return false;
        }
    }
    return true;

}
private bool Variable()//变量
{
    if (strList[j] == "i")
    {
        return true;
    }
    else
    {
        return false;
    }
}
#region 词法分析
List<string> strList;
List<int> typeList;
List<int> rowList;
private void WordAnalyse()//词法分析
{
    strList = new List<string>();
    typeList = new List<int>();
    rowList = new List<int>();
    int row = 0;
    char[] arr = richTextBox1.Text.ToCharArray();
    List<char> l = new List<char>();

    string s;
    bool letterStar = false; bool digitStart = false;
    for (int i = 0; i < arr.Count(); i++)
    {
        if (isLetter(arr[i]))//字母
        {
            l.Add(arr[i]);
            if (digitStart == true) label1.Text = "第" + row.ToString() + "行出错!";
            if (letterStar == false && digitStart == false) letterStar = true;
        }
        else if (isDigit(arr[i]))//数字
        {
            l.Add(arr[i]);
            if (letterStar == false && digitStart == false) digitStart = true;
        }
        else if (isoperate(arr[i]) == true)//运算符
        {
            s = new string(l.ToArray());
            if (digitStart == true)
            {
                Save(row, 3, s);
            }
            else if (letterStar == true)
            {
                if (isKeyword(s))
                    Save(row, 1, s);
                else
                    Save(row, 2, s);
            }
            letterStar = false; digitStart = false;
            l.Clear();


            if ((arr[i] == '<') && ((arr[i + 1] == '=') || (arr[i + 1] == '>')))
            {
                l.Add(arr[i]);
                l.Add(arr[i + 1]);
                i++;
            }
            else if ((arr[i] == '>') && (arr[i + 1] == '='))
            {
                l.Add(arr[i]);
                l.Add(arr[i + 1]);
                i++;
            }
            else
            {
                l.Add(arr[i]);
            }

            s = new string(l.ToArray());
            Save(row, 4, s);
            l.Clear();
        }
        else if (isSeperate(arr[i]))//分隔符
        {
            s = new string(l.ToArray());
            if (digitStart == true)
            {
                Save(row, 3, s);
            }
            else if (letterStar == true)
            {
                if (isKeyword(s))
                    Save(row, 1, s);
                else
                    Save(row, 2, s);
            }
            letterStar = false; digitStart = false;
            l.Clear();

            if (arr[i] == '\n') row = row + 1;//行数

            if (!(arr[i] == ' ') && !(arr[i] == '\n') && !(arr[i] == '\t'))
            {
                if (arr[i] == ':' && arr[i + 1] == '=')
                {
                    l.Add(arr[i]);
                    l.Add(arr[i + 1]);
                    i++;
                }
                else
                {
                    l.Add(arr[i]);
                }
                s = new string(l.ToArray());
                Save(row, 5, s);
                l.Clear();
            }
        }
        else
        {
            label1.Text = "第" + row.ToString() + "行非法字符!";
        }
        if (i == arr.Count() - 1)
        {
            s = new string(l.ToArray());
            if (digitStart == true)
            {
                Save(row, 3, s);
            }
            else if (letterStar == true)
            {
                if (isKeyword(s))
                    Save(row, 1, s);
                else
                    Save(row, 2, s);
            }
            letterStar = false; digitStart = false;
            l.Clear();

        }

    }
}





private bool isSeperate(char c)//是否分隔符
{
    bool boo = false;
    switch (c)
    {
        case ',': boo = true; break;//逗号
        case ';': boo = true; break;//分号
        case '.': boo = true; break;//句号
        case ':': boo = true; break;//冒号
        case '(': boo = true; break;
        case ')': boo = true; break;
        case ' ': boo = true; break;
        case '\n': boo = true; break;
        case '\t': boo = true; break;
        default: boo = false; break;
    }


    return boo;
}
private bool isKeyword(string str)//是否关键字
{
    bool boo = false;
    switch (str.ToUpperInvariant())
    {
        case "BEGIN": boo = true; break;
        case "DO": boo = true; break;
        case "ELSE": boo = true; break;
        case "END": boo = true; break;
        case "IF": boo = true; break;
        case "THEN": boo = true; break;
        case "VAR": boo = true; break;
        case "WHILE": boo = true; break;
        case "INTEGER": boo = true; break;

    }
    return boo;
}
private bool isoperate(char c)//是否操作符
{

    //bool boo=false;
    string str = "+-*/<=>";
    if (str.Contains(c))
        return true;
    else return false;
    //if (c == '+')
    //{
    //    boo=true;
    //}
    //if (c == '-')
    //{
    //    boo = true;
    //}
    //if (c == '*')
    //{
    //    boo = true;
    //}
    //if (c == '/')
    //{
    //    boo = true;
    //}
    //if (c == '<')
    //{
    //    boo = true;
    //}
    //if (c == '=')
    //{
    //    boo = true;
    //}
    //if (c == '>')
    //{
    //    boo = true;
    //}
    //return boo;

}
private bool isLetter(char c)//是否字母或下划线
{
    bool boo = false;
    string str = "abcdefghijklmnopqrstuvwxyz_";
    if (str.Contains(c))
    {
        boo = true;
    }
    string str1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_";
    if (str1.Contains(c))
    {
        boo = true;
    }
    return boo;
}
private bool isDigit(char c)//是否数字
{
    bool boo = false;
    string str = "0123456789";
    if (str.Contains(c))
    {
        boo = true;
    }
    return boo;
}
private void Save(int row, int type, string word)
{
    rowList.Add(row);
    typeList.Add(type);
    strList.Add(word);
}
#endregion
} 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -