Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C parser recursion

Tags:

c

recursion

lisp

I'm making a simple program in C an Lisp arithmetic calculator just involving integers and "+ - * /" operators, I'm doing this for learning purposes it's not my homework or something like that.

So I have made a function which will correctly parse something like this (+ 2 3) it would output 5, so I know how to handle non nested statements but what when I have something like this (+ (* 2 3) (- 4 2)) so it seems like I can use recursion to solve this, but I don't know really how to do it.

My logic is following(in pseudo code):`

  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);

`

So is my logic correct here, if I have (+ (* 2 3) (- 4 2)) I would just calc. (* 2 3), how would I go about calculating the (- 4 2) and then adding those two result together

like image 409
Yippee-ki-yay Avatar asked Feb 20 '23 12:02

Yippee-ki-yay


1 Answers

You're definitely on the right track.

Assume that we have a getToken() function written which reads the next logical token in the string from the current position. A logical token would be a number, '(', ')' or any of the four operators. Then we can recursively evaluate expressions.

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;
}

The functions isNumber() and isLeftParen() do what they imply, return true if the token passed to it is a number or left parenthesis respectively. The evaluate() function takes the operator token as well as the two numbers to evaluate them. Eg, evaluate(+,2,4) would return 6 and evaluate(-,2,4) would return 2.

like image 169
ChrisHarris2012 Avatar answered Mar 04 '23 14:03

ChrisHarris2012