微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在buildyourownlisp.com上使用的MPC功能似乎不起作用或不存在

如何解决在buildyourownlisp.com上使用的MPC功能似乎不起作用或不存在

我目前正在研究buildyourownlisp,到目前为止,我真的很喜欢它,但是目前我遇到了一个奇怪的问题。这本书使用了多精度C库来为Lisp解释器编写语法。由于我在Linux系统上安装了devtools,因此我也安装了mpc和libmpc数据包。 但是,当我运行本书中的代码时,我遇到了语法问题。该库中似乎没有mpc_parser_t,我什至找不到它在网上使用。 我使用的代码

/* Create Some Parsers */
mpc_parser_t* Number   = mpc_new("number");
mpc_parser_t* Operator = mpc_new("operator");
mpc_parser_t* Expr     = mpc_new("expr");
mpc_parser_t* Lispy    = mpc_new("lispy");

/* Define them with the following Language */
mpca_lang(MPCA_LANG_DEFAULT,"                                                     \
    number   : /-?[0-9]+/ ;                             \
    operator : '+' | '-' | '*' | '/' ;                  \
    expr     : <number> | '(' <operator> <expr>+ ')' ;  \
    lispy    : /^/ <operator> <expr>+ /$/ ;             \
  ",Number,Operator,Expr,Lispy);

每次使用mpc_parser_t以及mpca_langMPCA_LANG_DEFAULT时,编译器都会向我抛出错误。这是一个示例:

prompt.c:8:2: error: unkNown type name ‘mpc_parser_t’; did you mean ‘mp_prec_t’?
    8 |  mpc_parser_t* Number = mpc_new("number");
      |  ^~~~~~~~~~~~
      |  mp_prec_t

我找不到其他人报告这些问题,但是我看不到我在做什么错,任何建议都值得赞赏。

编辑:以下是我正在尝试编译的所有代码,因为Paul Ogilvie要求我显示包含文件的位置。

#include <mpc.h>

#ifdef _WIN32

static char buffer[2048];

char* readline(char* prompt) {
  fputs(prompt,stdout);
  fgets(buffer,2048,stdin);
  char* cpy = malloc(strlen(buffer)+1);
  strcpy(cpy,buffer);
  cpy[strlen(cpy)-1] = '\0';
  return cpy;
}

void add_history(char* unused) {}

#else
#include <editline/readline.h>
#endif

int main(int argc,char** argv) {
  
  /* Create Some Parsers */
  mpc_parser_t* Number   = mpc_new("number");
  mpc_parser_t* Operator = mpc_new("operator");
  mpc_parser_t* Expr     = mpc_new("expr");
  mpc_parser_t* Lispy    = mpc_new("lispy");
  
  /* Define them with the following Language */
  mpca_lang(MPCA_LANG_DEFAULT,"                                                     \
      number   : /-?[0-9]+/ ;                             \
      operator : '+' | '-' | '*' | '/' ;                  \
      expr     : <number> | '(' <operator> <expr>+ ')' ;  \
      lispy    : /^/ <operator> <expr>+ /$/ ;             \
    ",Lispy);
  
  puts("Lispy Version 0.0.0.0.2");
  puts("Press Ctrl+c to Exit\n");
  
  while (1) {
  
    char* input = readline("lispy> ");
    add_history(input);
    
    /* Attempt to parse the user input */
    mpc_result_t r;
    if (mpc_parse("<stdin>",input,Lispy,&r)) {
      /* On success print and delete the AST */
      mpc_ast_print(r.output);
      mpc_ast_delete(r.output);
    } else {
      /* Otherwise print and delete the Error */
      mpc_err_print(r.error);
      mpc_err_delete(r.error);
    }
    
    free(input);
  }
  
  /* Undefine and delete our parsers */
  mpc_cleanup(4,Lispy);
  
  return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。