0

我正在尝试使用 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 '='

我找不到错误,我确定语法中定义了一些错误,但我在官方文档或示例中找不到任何线索

4

2 回答 2

0

我不是 mpc 方面的专家,我可能错了,事实上我现在遇到了自己的问题,但我认为它不支持左递归。因此,由于 expr 包含在 expr 规则中,因此会导致错误。

编辑* 我能够通过移动我的部分扩展来解决我的问题。因此,您的等价物是将变量一直向右移动,以便它首先尝试使用其他两个扩展进行解析。我不能确定这是否会导致您的问题,但可能值得一试。

于 2017-01-05T00:01:30.273 回答
0

mpc 的作者在这里回答了我的问题:

我只是将规则定义的一部分从

" expr         : <variable> | <remind> <variable> '}' | <variable> <assign> <expr>+ '}' ;"

至:

" expr         : <remind> <variable> '}' |  <variable> <assign> <expr>+ '}' | <variable>;"

发生这种情况是因为 mpc 中没有回溯,因此评估规则顺序很重要

于 2017-01-05T08:53:29.337 回答