快捷搜索:  xxx  as  推理研究所  幼幼  侦探研究所

大发888黄金版手机网页版登录:与或表达式化简



本文示例源代码或素材下载

一、问题的提出

要是我们有如下所示的与/或表达式:

a*[b*[c+d]*e+f]+g化简后要获得如下的表达式:

a*b*c*e+a*b*d*e+a*f+g 表达式中容许的字母和算符

{A-Z, a-z, [,],*,+}此中“[,]”表示括号,容许嵌套;“*”表示逻辑运算符“与”;“+”表示逻辑运算符“或”;并且“*”的优先级高于“+”。

二、办理法子

在编译道理中,有一种自上而下阐发措施LL(1),其核心算法便是“递归下降法”,其详细理论有兴趣的同伙可以参考一些编译道理册本。首先让我们来看一个编译道理讲义上用“递归下降法”进行“表达式的求值”的阐发获得的孕育发生式:

exp->exp addop term|term

addop->+|-

term->term mulop factor|facto大发888黄金版手机网页版登录r

mulop->*

factor->(exp)|number     此中“exp”代表待求值的表达式;“addop”代表“+”和“-”运算符;“term”代表用&大发888黄金版手机网页版登录ldquo;*”连接起来的表达式;“mulop”代表“*”;“factor”代表乘积因子,它可所以一个数,也可所以大发888黄金版手机网页版登录一个表达式。

按照这种思路,我得出了如下的对应于本文开首所提出问题的孕育发生式:

exp->term { OR term }|term

OR->+

term->term AND factor|factor

AND->*

factor->[exp]|letter

letter->[A-Z]|[a-z大发888黄金版手机网页版登录]   去除左递归后如下所示:

exp->term { OR term }

OR->+

term->factor { AND factor 大发888黄金版手机网页版登录}

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;

}  其它的孕育发生式对应的代码类似,详细细节就不论述了,请大年夜家参考参考源法度榜样。

三、运行效果图

四、停止语

这是我第一次在VCKBASE上颁发的文章,此中肯定存在许多不够之处,盼望大年夜家指出来品评斧正

^-^。同时,我也感到到深为一论理进修谋略机的门生,富厚的编程实际履历固然紧张,但假如具有富厚的理论根基作为刚强后盾的话,那么我们在编写法度榜样时就会游刃有余,才会感到到写法度榜样是一种真正的享受^-^。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: