反转C中的中缀表达式

  • 本文关键字:中缀 表达式 反转 c
  • 更新时间 :
  • 英文 :


这样;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);
}

最新更新