C解析器递归

Yip*_*yay 4 c lisp recursion

我在C和Lisp算术计算器中制作一个简单的程序,只涉及整数和"+ - * /"运算符,我这样做是为了学习目的,这不是我的作业或类似的东西.

所以我已经创建了一个函数,它将正确地解析这样(+ 2 3)输出5的东西,所以我知道如何处理非嵌套语句,但是当我有这样的东西时,我觉得(+ (* 2 3) (- 4 2))我可以使用递归来解决这个问题,但我不知道我不知道该怎么做.

我的逻辑是(伪代码):`

  function parse_line(int n)
    get_input(string);
    if string[n] == '('
     if string[n+1] == operator
      if string[n+3] == number
       result = parseAllNumbers(); //between ( )
       return result; 
    if string[n+3] == '('
     parse_line(n+2);
Run Code Online (Sandbox Code Playgroud)

`

所以我的逻辑在这里是正确的,如果我有,(+ (* 2 3) (- 4 2))我只会计算.(* 2 3),我将如何计算(- 4 2),然后将这两个结果加在一起

Chr*_*012 5

你肯定是在正确的轨道上.

假设我们getToken()编写了一个函数,它从当前位置读取字符串中的下一个逻辑标记.逻辑令牌可以是数字,'(',')'或四个运算符中的任何一个.然后我们可以递归计算表达式.

function evaluateExpression(){
    var token = getToken();

    if( isNumber(token)){
        return token;
    }else if( isOpenParen(token)){
        return evaluateExpression();
    }

    var numOne = evaluateExpression();
    var nextToken = null;
    while( !isRightParen(nextToken)){
        nextToken = getToken();
        numOne = evaluate(token, numOne, nextToken);
    }

    return numOne;
}
Run Code Online (Sandbox Code Playgroud)

函数isNumber()isLeftParen()执行它们所暗示的函数,如果传递给它的标记分别是数字或左括号,则返回true.该evaluate()函数接受运算符令牌以及两个数字来评估它们.例如,evaluate(+,2,4)将返回6evaluate(-,2,4)将返回2.