c - 使用 C 中的 MPC 库进行解析仅返回第一个数字

标签 c parsing rpn

我正在尝试使用 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 - 使用 C 中的 MPC 库进行解析仅返回第一个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30791786/

相关文章:

c - 警告 : control reaches end of non-void function (gtk)

c - OpenGL/glut 背景多边形似乎与前景多边形重叠

c - 如何在不使用运算符 [] 的情况下在 C 中打印二维数组?

python - 在python中解析json文件

c - 尝试使用一堆字符串将反向波兰表示法转换为中缀,遇到一个小错误,我不知道是什么原因造成的

c - 为什么两个不同函数的数组和指针参数的地址相同?

javascript - 删除标签名称和所有选择器,但不删除内容

xml - 如何用 XPath 返回数组?

java - 逆波兰给出错误答案

c++ - RPN 计算器无法正确执行计算