根据编译原理相关知识,我们可将整个程序分为三个部分,词法分析,文法分析,后缀表达式计算,在文法分析中会涉及到运算符优先级的判断。接下来我将分模块对代码进行解释,希望可以对读者理解算符优先文法、词法分析有和后缀表达式求值有所帮助。
代码可以识别包含括号的基本四则运算和乘方运算,可以识别浮点数,未进行错误运算时的错误处理。
运算符优先级
如数组sp所示,1表示栈内优先级高于栈外优先级,-1表示栈内优先级低于栈外优先级, 0表示优先级相等,需要特别处理,99表示输入错误,符号不匹配或输入字符不可识别。
对于+、-、*、/四个运算符来说,由于运算符的左结合性,相同的符号栈内的优先级高于栈外的优先级;而幂运算具有右结合性,因此,两个^相比,栈外优先级高于栈内优先级。
对于不同的两个运算符,()中的优先级最高,幂运算高于乘除,乘除高于加减。
int SignPriority(char in, char out) {
int sp[9][9] = {
{
1, 1, -1, -1, -1, -1, 1, 1, 99}, //'+'
{
1, 1, -1, -1, -1, -1, 1, 1, 99}, //'-'
{
1, 1, 1, 1, -1, -1, 1, 1, 99}, //'*'
{
1, 1, 1, 1, -1, -1, 1, 1, 99}, //'/'
{
1, 1, 1, 1, -1, -1, 1, 1, 99}, //'^'
{
-1, -1, -1, -1, -1, -1, 0, 99, 99}, //'('
{
1, 1, 1,