C++ 处理条件语句
我不是在寻找一个实现,只是一个伪代码,或者至少是一个有效处理这个问题的算法。我需要处理如下语句:C++ 处理条件语句,c++,algorithm,parsing,c++11,C++,Algorithm,Parsing,C++11,我不是在寻找一个实现,只是一个伪代码,或者至少是一个有效处理这个问题的算法。我需要处理如下语句: (a) # if(a) (a,b) # if(a || b) (a+b) # if(a && b) (a+b,c) # same as ((a+b),c) or if((a&&b) || c) (a,b+c) # same as (a,(b|c)) or if(a || (b&&c)) 因此+运算符优先于,运算符。(所以我的+就像是带
(a) # if(a)
(a,b) # if(a || b)
(a+b) # if(a && b)
(a+b,c) # same as ((a+b),c) or if((a&&b) || c)
(a,b+c) # same as (a,(b|c)) or if(a || (b&&c))
因此+
运算符优先于,
运算符。(所以我的+
就像是带的数学乘法,
是数学加法,但这很让人困惑)
我认为递归函数最好,所以我可以通过递归调用轻松地处理嵌套括号。一旦函数返回,我还会处理错误处理,所以不用担心。我遇到的问题是:
,
且上一个值为true,我就可以返回true。否则,我将重新运行相同的例程。加号实际上是布尔乘法(即true*true=true
,true*false=false
等)
()
(,...
(+...
(a,,...
(a,+...
(a+,...
(a++...
在我上面的“例行程序”中检测这些应该会处理错误的输入。当然,每次读取令牌时,我都会检查输入的结尾代码>也应该像经典的not操作符一样可用:
(!a+b,c,!d)
对于那些感兴趣的人来说,这是一个小小的更新:我对此一无所知,并从头开始编写了自己的实现。对于顽固分子来说,它可能不够漂亮。只需相对较短的代码即可轻松实现。它可以用于将中缀表达式(如示例中的中缀表达式)转换为后缀表达式,后缀表达式的计算非常简单,只需使用a-capital-E即可(您不必严格地完成中缀到后缀的转换;您可以直接计算调车场的后缀输出,并在进行计算时累积结果).
它处理运算符优先级、括号以及一元运算符和二元运算符(只需稍加修改即可处理中缀三元运算符,就像许多语言中的条件运算符一样)。对此可能有更好的(肯定有更简洁的)描述,但多年前,我从本教程中学到了如何做到这一点:
对于非程序员(像我一样)来说,这也是一本非常容易阅读的书。你只需要前几章就可以了。用yacc(bison)写吧,它变得微不足道了
/* Yeacc Code */
%token IDENTIFIER
%token LITERAL
%%
Expression: OrExpression
OrExpression: AndExpression
| OrExpression ',' AndExpression
AndExpression: NotExpression
| AndExpression '+' NotExpression
NotExpression: PrimaryExpression
| '!' NotExpression
PrimaryExpression: Identifier
| Literal
| '(' Expression ')'
Literal: LITERAL
Identifier: IDENTIFIER
%%
“处理”是指解析吗?“或者你正在C++操作运算符重载吗?”埃米尔:我是说解析是的,我需要把文本变成一个布尔值,比较<代码> A<代码> >代码> B>代码>和<代码> C >代码>参数。一旦令牌被安排在RPN形式中,这是很容易的。虽然我没有在我的问题中指定,但我尝试自己做这件事,作为一种学习经验,并且限制依赖于一个体面的C++编译器。谢谢,这只是强调了我的C++代码最终会有多大:))@ RuNVB:你仍然必须编写C++代码来处理令牌(并将其添加到上面的文件)。该文件将生成正确的C/C++来执行实际的解析,同时您将担心如何处理结果。