从Token Stream解析表达式

met*_*man 5 parsing expression

我正在尝试解析一个简单的脚本语言的表达式,但我很困惑.现在,只能将数字和字符串文字解析为表达式:

int x = 5;
double y = 3.4;
str t = "this is a string";
Run Code Online (Sandbox Code Playgroud)

但是,我对解析更复杂的表达式很困惑:

int a = 5 + 9;
int x = (5 + a) - (a ^ 2);
Run Code Online (Sandbox Code Playgroud)

我想我会像下面这样实现它:

do {
    // no clue what I would do here?        

    if (current token is a semi colon) break;
}
while (true);
Run Code Online (Sandbox Code Playgroud)

任何帮助都会很棒,我不知道从哪里开始.谢谢.

编辑:我的解析器是递归下降解析器

我的表达"类"如下:

typedef struct s_Expression {
    char type;
    Token *value;

    struct s_Expression *leftHand;
    char operand;
    struct s_Expression *rightHand;
} ExpressionNode;
Run Code Online (Sandbox Code Playgroud)

有人提到递归下降解析器能够解析表达式而不做中缀,而不是后缀.最好,我想要一个像这样的表达式:

例如:

int x = (5 + 5) - (a / b);
Run Code Online (Sandbox Code Playgroud)

将被解析为:注意:这不是有效的C,这只是一些伪的ish代码来简单地得到我的观点:)

ExpressionNode lh;
lh.leftHand = new ExpressionNode(5);
lh.operand = '+'
lh.rightHand = new ExpressionNode(5);

ExpressionNode rh;
rh.leftHand = new ExpressionNode(a);
rh.operand = '/';
rh.rightHand = new ExpressionNode(b);

ExpressionNode res;
res.leftHand = lh;
res.operand = '-';
res.rightHand = rh;
Run Code Online (Sandbox Code Playgroud)

我很晚才问这个问题,很抱歉,如果我不清楚,我完全忘记了我最初的目标.

met*_*man 1

我最终使用的方法是运算符优先级解析。

parse_expression_1 (lhs, min_precedence)
    lookahead := peek next token
    while lookahead is a binary operator whose precedence is >= min_precedence
        op := lookahead
        advance to next token
        rhs := parse_primary ()
        lookahead := peek next token
        while lookahead is a binary operator whose precedence is greater
                 than op's, or a right-associative operator
                 whose precedence is equal to op's
            rhs := parse_expression_1 (rhs, lookahead's precedence)
            lookahead := peek next token
        lhs := the result of applying op with operands lhs and rhs
    return lhs
Run Code Online (Sandbox Code Playgroud)