我正在尝试使用MPC来定义一种名为Wittgen (https://esolangs.org/wiki/Wittgen)的语言语法
我定义了以下语法:
mpc_parser_t* Variable = mpc_new("variable");
mpc_parser_t* Assign_Operator = mpc_new("assign");
mpc_parser_t* Remind_Operator = mpc_new("remind");
mpc_parser_t* Expr = mpc_new("expr");
mpc_parser_t* Envinronment = mpc_new("envinronment");
mpca_lang(MPCA_LANG_DEFAULT,
" variable : /[a-zA-Z0-9]+/ ;"
" assign : '=' ;"
" remind : '@' ;"
" expr : <variable> | <remind> <variable> '}' | <variable> <assign> <expr>+ '}' ;"
" envinronment : /^/<expr>+/$/ ;",
Variable, Assign_Operator, Remind_Operator, Expr, Envinronment);
当我尝试输入变量或提醒操作符(如"foo247"或"@foo247}")时,它会正确解析它,但是当我尝试解析一个赋值("foo247=foo}")时,它返回给我的只是
WITTGEN> foo357=foo}
<stdin>:1:7: error: expected one of 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ', one or more of one of 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ', '@' or end of input at '='
我找不到错误,我确定语法中定义的错误,但我在官方文档或示例中找不到任何线索
我不是mpc专家,我可能错了,事实上我现在有我自己的问题,但我不认为它支持左递归。因此,由于expr包含在expr规则中,它会导致错误。
编辑*我能够通过移动我的扩展的一部分来解决我的问题。所以等价的是把变量一直移到右边,这样它就会先用另外两个展开来解析。我不能确定这是不是你的病因,但值得一试。
我的问题在这里得到了mpc作者的回答:
我只是从
更改了规则定义的部分" expr : <variable> | <remind> <variable> '}' | <variable> <assign> <expr>+ '}' ;"
:
" expr : <remind> <variable> '}' | <variable> <assign> <expr>+ '}' | <variable>;"
这是因为在mpc中没有回溯,所以求值规则的顺序很重要