处理条件语句

rub*_*nvb 2 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))
Run Code Online (Sandbox Code Playgroud)

因此,+运营商优先于,运营商.(所以我+的数学乘法与,数学加法相似,但这只是令人困惑).

我认为递归函数是最好的,所以我可以通过递归调用很好地处理嵌套括号.一旦函数返回,我也会处理错误处理,所以不用担心.我遇到的问题:

  1. 我只是不知道如何处理优先事项.我return true一看到a就可以,,之前的值是真的.否则,我会重新运行相同的例行程序.A加将有效是一个布尔乘(即true*true=true,true*false=false等...).

  2. 错误检测:我已经想到了几种处理输入的方案,但是我想检测很多丑陋的东西并向用户输出错误.我认为没有一种方案能够在代码中的统一(读取:集中)位置处理错误,这对于可维护性和可读性来说是很好的:

    ()
    (,...
    (+...
    (a,,...
    (a,+...
    (a+,...
    (a++...
    
    Run Code Online (Sandbox Code Playgroud)

    在上面的"例程"中检测这些应该处理不好的输入.当然,每次读取令牌时,我都会检查输入结束.

当然,如果有不匹配的括号,我会遇到可能已经阅读全文文件的问题,但是,嘿,人们应该避免这种紧张.

编辑:啊,是的,我忘了!哪些也应该像经典的非运算符一样可用:

(!a+b,c,!d)
Run Code Online (Sandbox Code Playgroud)

对那些感兴趣的人进行微小的更新:我有一个不知情的狂野,并从头开始编写我自己的实现.对于顽固派而言,这可能还不够,所以关于codereview的这个问题.

Jam*_*lis 6

所述调度场算法是在代码相对短的量容易实现.它可以用来将你的例子中的中缀表达式转换为后缀表达式,并且后缀表达式的评估是Easy-with-a-capital-E(你不需要完全完成中缀到后缀的转换;你可以直接评估分流场的后缀输出,并随着你的进展积累结果).

它处理运算符优先级,括号以及一元和二元运算符(并且可以通过一些努力来修改以处理中缀三元运算符,如许多语言中的条件运算符).

  • 分流码是要走的路,一旦令牌以RPN形式排列,这很容易. (2认同)