分类: C/C++
2008-04-23 21:50:36
与/或表达式化简
作者: (西安理工大学 计算机学院)
a*[b*[c d]*e f] g化简后要得到如下的表达式:
a*b*c*e a*b*d*e a*f g表达式中允许的字母和算符
{A-Z, a-z, [,],*, }
其中“[,]”表示括号,允许嵌套;“*”表示逻辑运算符“与”;“ ”表示逻辑运算符“或”;并且“*”的优先级高于“ ”。 exp->exp addop term|term
addop-> |-
term->term mulop factor|factor
mulop->*
factor->(exp)|number
其中“exp”代表待求值的表达式;“addop”代表“ ”和“-”运算符;“term”代表用“*”连接起来的表达式;“mulop”代表“*”;“factor”代表乘积因子,它可以是一个数,也可以是一个表达式。 exp->term { OR term }|term
OR->
term->term AND factor|factor
AND->*
factor->[exp]|letter
letter->[A-Z]|[a-z]
去除左递归后如下所示: exp->term { OR term }
OR->
term->factor { AND factor }
factor->letter|[exp]
AND->*
letter->[A-Z]|[a-z]
这样,我们就很容易将其转化为代码。比如,将“exp->term { OR term }”这个表达式转化的伪代码如下:CString exp()
{
CString temp = _T("");
try
{
temp = Term();
while( 当前还没有到输入串的末尾 && 下一个将要扫描的字符为OR )
{
temp = " ";
Match(OR);//字符匹配,用户判断将要扫描的字符是否为所期望的字符,并且推动扫描串的前进
temp = Term();
}
}
catch(CError& error)
{
throw error;
}
return temp;
}
其它的产生式对应的代码类似,具体细节就不叙述了,请大家参考参考源程序。