C++ 关于中缀解析器后缀的建议

C++ 关于中缀解析器后缀的建议,c++,parsing,language-design,C++,Parsing,Language Design,我遇到了一种专有的基于堆栈的脚本语言,它看起来有点像x86 ASM的简化版本 我为C++语言构建了一个基于堆栈的线性解析器,希望能产生伪C代码,使语言更容易阅读。 我至少遇到了一个严重的问题,我觉得这与我的解析器的线性性质有关。。。例如,假设我们有以下代码: push const int push const str call some_method pop const str pop const int return last return val 通过我当前的实现,我可以非常轻松地生成以下

我遇到了一种专有的基于堆栈的脚本语言,它看起来有点像x86 ASM的简化版本

我为C++语言构建了一个基于堆栈的线性解析器,希望能产生伪C代码,使语言更容易阅读。 我至少遇到了一个严重的问题,我觉得这与我的解析器的线性性质有关。。。例如,假设我们有以下代码:

push const int
push const str
call some_method
pop const str
pop const int
return last return val
通过我当前的实现,我可以非常轻松地生成以下内容:

retval = some_method(str, int)
return retval
但以下将是一个巨大的痛苦:

return some_method(some_str, some_int)
当我遇到指令/操作码时,我会意识到-变量-被推到堆栈上,但仅此而已

归根结底,对于类似的指令组合(例如push+调用),我可以从后缀到中缀,但对于多个指令则不行

我在语言分析器方面非常缺乏经验,所以请对我放轻松!你的建议是什么?

你想要的是。安排有表达式的C++表示,例如

class Expression{...};
class StringConstant:public Expression{...};
class FunctionCall:public Expression{...};
然后,使符号堆栈包含
表达式*
。当你到达

return foo
把这个编译成

cout<<"return "; foo_expr->print();

coutprint用于所有未被使用的值。

就是这样,不能保证会有返回操作码。根据建议,我更多地考虑了解析技术。我读过关于从后到前构建层次结构树等内容,这些内容可能会解决我的特定问题。@Daniel:至于没有返回语句的函数,请参阅我的编辑。至于“解析技术的建议”——我确实相信解析技术在这里真的没有帮助。您描述的问题显然与内部表示有关,而不是与解析有关。