使用 C returns 中的 MPC 库仅解析第一个数字
Parsing with MPC library in C returns only first number
我正在尝试使用 C 的 MPC(微解析器组合器)库编写反向波兰表示法解析器。但是,我正在使用的语法有问题或其他地方有其他问题意味着它只输出第一个数字而不是完整的 AST。
语法:
mpc_parser_t* Number = mpc_new("number");
mpc_parser_t* Exp = mpc_new("exp");
mpc_parser_t* Exp1 = mpc_new("exp1");
mpc_parser_t* Term = mpc_new("term");
mpc_parser_t* Term1 = mpc_new("term1");
mpc_parser_t* RPN = mpc_new("rpn");
/* BNF for RPN */
mpca_lang(MPCA_LANG_DEFAULT,
" \
number : /-?[0-9]+/; \
exp : <term> <exp1>; \
exp1 : '+' <term> <exp1> | '-' <term> <exp1> | ''; \
term : <rpn> <term1>; \
term1 : '*' <rpn> <term1> | '/' <rpn> <term1> | ''; \
rpn : '(' <exp> ')' | <number>; \
", Number, Exp, Exp1, Term, Term1, RPN);
解析:
/* Attempt to Parse user input */
mpc_result_t r;
if (mpc_parse("<stdin>", input, RPN, &r)) {
/* On success print AST */
mpc_ast_print(r.output);
mpc_ast_delete(r.output);
} else {
/* Otherwise print error */
mpc_err_print(r.error);
mpc_err_delete(r.error);
}
输入:
2 2 +
输出:
number|regex:1:1 '2'
任何此类输入仅读取初始数字(例如“54 8 /”仅输出 54)。有什么想法吗?
问题出在您使用的 bnf :
查看您的示例 (2 2 +) 和您的输入规则:
rpn : '(' <exp> ')' | <number>;
1 - rpn 左侧部分与输入不匹配:2 != (
2 - 然后数字匹配
3 - 规则编号结束,规则 rpn 结束,停止解析
现在,我认为您可以尝试输入“( 2 2 + )”
解决方法是将输入规则的括号设为可选。
我正在尝试使用 C 的 MPC(微解析器组合器)库编写反向波兰表示法解析器。但是,我正在使用的语法有问题或其他地方有其他问题意味着它只输出第一个数字而不是完整的 AST。
语法:
mpc_parser_t* Number = mpc_new("number");
mpc_parser_t* Exp = mpc_new("exp");
mpc_parser_t* Exp1 = mpc_new("exp1");
mpc_parser_t* Term = mpc_new("term");
mpc_parser_t* Term1 = mpc_new("term1");
mpc_parser_t* RPN = mpc_new("rpn");
/* BNF for RPN */
mpca_lang(MPCA_LANG_DEFAULT,
" \
number : /-?[0-9]+/; \
exp : <term> <exp1>; \
exp1 : '+' <term> <exp1> | '-' <term> <exp1> | ''; \
term : <rpn> <term1>; \
term1 : '*' <rpn> <term1> | '/' <rpn> <term1> | ''; \
rpn : '(' <exp> ')' | <number>; \
", Number, Exp, Exp1, Term, Term1, RPN);
解析:
/* Attempt to Parse user input */
mpc_result_t r;
if (mpc_parse("<stdin>", input, RPN, &r)) {
/* On success print AST */
mpc_ast_print(r.output);
mpc_ast_delete(r.output);
} else {
/* Otherwise print error */
mpc_err_print(r.error);
mpc_err_delete(r.error);
}
输入:
2 2 +
输出:
number|regex:1:1 '2'
任何此类输入仅读取初始数字(例如“54 8 /”仅输出 54)。有什么想法吗?
问题出在您使用的 bnf :
查看您的示例 (2 2 +) 和您的输入规则:
rpn : '(' <exp> ')' | <number>;
1 - rpn 左侧部分与输入不匹配:2 != (
2 - 然后数字匹配
3 - 规则编号结束,规则 rpn 结束,停止解析
现在,我认为您可以尝试输入“( 2 2 + )”
解决方法是将输入规则的括号设为可选。