简单的语法分析(算术式不带括号)E\E'\T\T'\F过程

using System;

namespace test3
{
/*对于文法
E→TE’
E’→+TE’ | -TE’ |ε
T →FT’
T’→* FT’ | /FT’|ε
F →(E) | i
根据递归下降分析程序构造方法或者预测分析法,为该文法构造程序。该程序的功能为,给定输入,程序按照先后顺序将使用的产生式输出。
如,输入25.6 * 14.5 + 2(首先经过词法分析,将其转化为 i * i + i),则输出
E→TE’
T→FT’
F→i
T’→* FT’
F →i
T’→ε
E’→+TE’
T→FT’
F→i
T’→ε
E’→ε
*/
class Program
{
//转换计算式
static void Main(string[] args)
{
Console.WriteLine("请输入算术式:");
String startequation = Console.ReadLine();
char[] equation = new char[10];
int wei = 0;
char[] charToken = startequation.ToCharArray();
int start = 0;
bool grammer = true;
bool startchar = true;
for (int i = 0; i < charToken.Length; i++)
{
if (charToken[i] != ' ')
{
start = i;
break;
}
}
//循环遍历输入的字符,如果不为算术符号或不为数字或不为小数点,报错
for (int i = start; i < charToken.Length; i++)
{
//Console.WriteLine(charToken[i]);
if (!JudgeSymbol(charToken[i]))
{
if (!JudgeNumber(charToken[i]))
{
if (!Judgepoint(charToken[i]))
{
grammer = false;
break;
}
}
}
}
if (grammer)
{
startchar = Judgestart(charToken[start]);
for (int i = start; i < charToken.Length; i++)
{
if (startchar)
{
//如果是数字或小数点,不操作
if (JudgeNumber(charToken[i]) || Judgepoint(charToken[i]))
{
equation[wei] = 'i';
continue;
}
//如果不是数字,那就是算术符号
else
{
wei += 1;
equation[wei] = charToken[i];
wei += 1;
startchar = Judgestart(charToken[i + 1]);
}
}
}
}
else
{
Console.WriteLine("算术式中含有非算术符号非数字非小数点,格式错误!");
}
//查看转换后的算式
Console.WriteLine("算术式转化为:");
for (int i = 0; i < equation.Length; i++)
{
Console.Write(equation[i]);
}
Console.WriteLine();
E(equation, 0);
}
//E过程
public static void E(char[] c,int value)
{
Console.WriteLine("E→TE'");
ET(c, value);
}
//E-T过程
public static void ET(char[] c, int value)
{
//Console.WriteLine(c[value]);
T(c, value);
}
//E-E1过程
public static void EE1(char[] c, int value)
{
//Console.WriteLine(c[value]);
E1(c, value);
}
//T过程
public static void T(char[] c, int value)
{
Console.WriteLine("T→FT'");
TF(c, value);
}
//TF过程
public static void TF(char[] c, int value)
{
//Console.WriteLine(c[value]);
F(c, value);
}
//TT1过程
public static void TT1(char[] c, int value)
{
//Console.WriteLine(c[value]);
T1(c, value);
}
//E1过程
public static void E1(char[] c, int value)
{
//判断‘+’
if (c[value] == '+')
{
Console.WriteLine("E'→+TE'");
//Console.WriteLine(c[value + 1]);
T(c, value + 1);
}
//判断‘-’
else if (c[value] == '-')
{
Console.WriteLine("E'→-TE'");
//Console.WriteLine(c[value + 1]);
T(c, value + 1);
}
else
{
Console.WriteLine("E'→ε");
}
}
//T1过程
public static void T1(char[] c,int value)
{
//判断‘*’
if (c[value] == '*')
{
Console.WriteLine("T'→*FT'");
//Console.WriteLine(c[value + 1]);
F(c, value + 1);
//T1(c, value + 2);
}
//判断‘/’
else if (c[value] == '/')
{
Console.WriteLine("T'→/FT'");
//Console.WriteLine(c[value + 1]);
F(c, value + 1);
//T1(c, value + 2);
}
else {
Console.WriteLine("T'→ε");
EE1(c, value);
}
}
//F
public static void F(char[] c,int value)
{
if (c[value] == '(')
{
Console.WriteLine("F→(E)");
E(c, value + 1);
}
//数字
else if (c[value] == 'i')
{
Console.WriteLine("F→i");
}
TT1(c,value + 1);
}
//判断算术符
public static bool JudgeSymbol(char c)
{
if ((c == '+') || (c == '-') || (c == '*') || (c == '/'))
{
return true;
}
return false;
}
//判断数字
public static bool JudgeNumber(char c)
{
if (c >= '0' && c <= '9')
{
return true;
}
return false;
}
//判断小数点
public static bool Judgepoint(char c)
{
if (c == '.')
{
return true;
}
return false;
}
//判断首字符不是符号和小数点
public static bool Judgestart(char c)
{
if (!JudgeSymbol(c) && !Judgepoint(c))
{
return true;
}
else
{
Console.WriteLine("格式错误!");
return false;
}
}
}
}

猜你喜欢

转载自www.cnblogs.com/hsyv123ve/p/8976045.html