这样;23+45〃;变成";45+23";?这与将中缀表达式转换为前缀表达式有关,这里的目标是能够首先反转中缀表达式
通常的方法是编写一些递归下降语法分析器,在内存中构建一些具体的语法树。
因此,您将首先定义几个struct
-,表示该树的各个节点(作为标记的并集类型(,然后对解析器进行编码,然后对节点的转换进行编码,再对其打印机进行编码。阅读有关抽象语法树的wikipage。
您可能想要使用像GNUbison或ANTLR这样的解析器生成器。
在编码之前,您当然应该阅读Dragon书籍之类的书籍。
您还应该阅读C编译器(如GCC(和调试器(如GDB(的文档
您可以从现有开源程序的源代码中获得灵感,如GNUmeric或octave、GNUplot或Lua、GNUguile或GNUbash。
PS。对于大学作业,请提及你学习过的源代码。你的老师可能会很高兴你读到它们。
这里有一个可读且易于理解的解决方案。它不是最有效的,但如果你在做中缀/后缀符号,你就不关心性能了:
/* brief swap in-place the operands of an expression of form `lhs op rhs` (no spaces)
* where op is a single character operator
*
* param expr string representing the expression. Must follow specified form
* param operator single character operator
*
* post p expr will contain `rhs op lhs` (no spaces)
*/
void reverse_expr(char* expr, char operator)
{
char* buffer = malloc(strlen(expr) + 1);
char* const operator_pos = strchr(expr, operator);
if (operator_pos == NULL)
{
fprintf(stderr, "invalid expression: missing '%c'", operator);
free(buffer);
exit(1);
}
*operator_pos = ' ';
sprintf(buffer, "%s+%s", expr, operator_pos + 1);
strcpy(expr, buffer);
free(buffer);
}