波兰表达式语法解析

本节把白话文叙述的规则用正式的描述语言编写,并在必要的地方使用正则表达式。下面就是波兰表达式最终的语法规则。认真阅读下方代码,验证其是否与之前叙述的规则相符。

  1. /* Create Some Parsers */
  2. mpc_parser_t* Number = mpc_new("number");
  3. mpc_parser_t* Operator = mpc_new("operator");
  4. mpc_parser_t* Expr = mpc_new("expr");
  5. mpc_parser_t* Lispy = mpc_new("lispy");
  6. /* Define them with the following Language */
  7. mpca_lang(MPCA_LANG_DEFAULT,
  8. " \
  9. number : /-?[0-9]+/ ; \
  10. operator : '+' | '-' | '*' | '/' ; \
  11. expr : <number> | '(' <operator> <expr>+ ')' ; \
  12. lispy : /^/ <operator> <expr>+ /$/ ; \
  13. ",
  14. Number, Operator, Expr, Lispy);

我们还需要将代码放入第四章编写的交互式程序。将上面的代码放在 main 函数的开头处,打印版本信息的代码之前。另外,在 main 函数的最后,还应该将使用完毕的解析器删除。只需要将下面的代码放在 return 语句之前即可。

/ Undefine and Delete our Parsers / mpc_cleanup(4, Number, Operator, Expr, Lispy);

编译的时候得到一个错误:undefined reference to 'mpc_lang'

注意函数的名字为 mpca_langmpc 后面有个 a 字母。