mumble

A Lisp written in C, following the *Build Your Own Lisp* book
Log | Files | Refs | README

maths.c (1164B)


      1 #include "../mpc.h"
      2 
      3 int main(int argc, char **argv) {
      4   
      5   mpc_parser_t *Expr  = mpc_new("expression");
      6   mpc_parser_t *Prod  = mpc_new("product");
      7   mpc_parser_t *Value = mpc_new("value");
      8   mpc_parser_t *Maths = mpc_new("maths");
      9   
     10   mpca_lang(MPCA_LANG_PREDICTIVE,
     11     " expression : <product> (('+' | '-') <product>)*; "
     12     " product : <value>   (('*' | '/')   <value>)*;    "
     13     " value : /[0-9]+/ | '(' <expression> ')';         "
     14     " maths : /^/ <expression> /$/;                    ",
     15     Expr, Prod, Value, Maths, NULL);
     16   
     17   mpc_print(Expr);
     18   mpc_print(Prod);
     19   mpc_print(Value);
     20   mpc_print(Maths);
     21   
     22   if (argc > 1) {
     23     
     24     mpc_result_t r;
     25     if (mpc_parse_contents(argv[1], Maths, &r)) {
     26       mpc_ast_print(r.output);
     27       mpc_ast_delete(r.output);
     28     } else {
     29       mpc_err_print(r.error);
     30       mpc_err_delete(r.error);
     31     }
     32     
     33   } else {
     34 
     35     mpc_result_t r;
     36     if (mpc_parse_pipe("<stdin>", stdin, Maths, &r)) {
     37       mpc_ast_print(r.output);
     38       mpc_ast_delete(r.output);
     39     } else {
     40       mpc_err_print(r.error);
     41       mpc_err_delete(r.error);
     42     }
     43   
     44   }
     45 
     46   mpc_cleanup(4, Expr, Prod, Value, Maths);
     47   
     48   return 0;
     49   
     50 }
     51