如何解决在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_lang
和MPCA_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 举报,一经查实,本站将立刻删除。