/* lpard.c: parser for simple lisp, early scan * grammar: sexpr ---> alphanum | "(" tail * tail ---> ")" | sexpr tail */ #include #include #include void sexpr(void); void tail(void); char gettoken(void); void err(int); void nestBlanks(int n); void enter(char* s); void leave(char* s); char tok; /* the next token */ int debug = 1; /* produce debug output */ int nest; /* used for debug output */ void main(void) { tok = gettoken(); sexpr(); } /* sexpr: recognize a lisp s-expression */ void sexpr(void) { if (debug) enter("sexpr"); if (isalnum(tok)) tok = gettoken(); else if (tok == '(') { tok = gettoken(); tail(); } else err(0); if (debug) leave("sexpr"); } /* tail: recognize tail end of a lisp s-expression */ void tail (void) { if (debug) enter("tail"); if (tok == ')') tok = gettoken(); else { sexpr(); tail(); } if (debug) leave("tail"); } four06% lpares (a (b c) d) +Enter sexpr, tok: ( | +Enter tail, tok: a | | +Enter sexpr, tok: a | | +Leave sexpr, tok: ( | | +Enter tail, tok: ( | | | +Enter sexpr, tok: ( | | | | +Enter tail, tok: b | | | | | +Enter sexpr, tok: b | | | | | +Leave sexpr, tok: c | | | | | +Enter tail, tok: c | | | | | | +Enter sexpr, tok: c | | | | | | +Leave sexpr, tok: ) | | | | | | +Enter tail, tok: ) | | | | | | +Leave tail, tok: d | | | | | +Leave tail, tok: d | | | | +Leave tail, tok: d | | | +Leave sexpr, tok: d | | | +Enter tail, tok: d | | | | +Enter sexpr, tok: d | | | | +Leave sexpr, tok: ) | | | | +Enter tail, tok: ) CTRL-D entered | | | | +Leave tail, tok: | | | +Leave tail, tok: | | +Leave tail, tok: | +Leave tail, tok: +Leave sexpr, tok: /* lpard.c: parser for simple lisp, late scan * grammar: sexpr ---> alphanum | "(" tail * tail ---> ")" | sexpr tail */ #include #include #include void sexpr(void); void tail(void); char gettoken(void); void err(int); void nestBlanks(int n); void enter(char* s); void leave(char* s); char tok; /* the next token */ int debug = 1; /* produce debug output */ int nest; /* used for debug output */ void main(void) { tok = gettoken(); sexpr(); } /* sexpr: recognize a lisp s-expression */ void sexpr(void) { if (debug) enter("sexpr"); if (isalnum(tok)) ; /* nothing for now */ else if (tok == '(') tail(); else err(0); if (debug) leave("sexpr"); } /* tail: recognize tail end of a lisp s-expression */ void tail (void) { if (debug) enter("tail"); tok = gettoken(); if (tok == ')') ; /* nothing for now */ else { sexpr(); tail(); } if (debug) leave("tail"); } four06% lpard (a (b c) d) +Enter sexpr, tok: ( | +Enter tail, tok: ( | | +Enter sexpr, tok: a | | +Leave sexpr, tok: a | | +Enter tail, tok: a | | | +Enter sexpr, tok: ( | | | | +Enter tail, tok: ( | | | | | +Enter sexpr, tok: b | | | | | +Leave sexpr, tok: b | | | | | +Enter tail, tok: b | | | | | | +Enter sexpr, tok: c | | | | | | +Leave sexpr, tok: c | | | | | | +Enter tail, tok: c | | | | | | +Leave tail, tok: ) | | | | | +Leave tail, tok: ) | | | | +Leave tail, tok: ) | | | +Leave sexpr, tok: ) | | | +Enter tail, tok: ) | | | | +Enter sexpr, tok: d | | | | +Leave sexpr, tok: d | | | | +Enter tail, tok: d | | | | +Leave tail, tok: ) | | | +Leave tail, tok: ) | | +Leave tail, tok: ) | +Leave tail, tok: ) +Leave sexpr, tok: )