与/或表达式化简,与/或表达式化简
【 tulaoshi.com - C语言心得技巧 】
与/或表达式化简
作者:袁国桃 (西安理工大学 计算机学院)
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;}其它的产生式对应的代码类似,具体细节就不叙述了,请大家参考参考源程序。
来源:http://www.tulaoshi.com/n/20160129/1485192.html