Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 处理条件语句_C++_Algorithm_Parsing_C++11 - Fatal编程技术网

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++来执行实际的解析,同时您将担心如何处理结果。