分类: 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; }其它的产生式对应的代码类似,具体细节就不叙述了,请大家参考参考源程序。