使用 MPC 库解析 returns 语法定义错误
Parsing with MPC library returns error on grammar definition
我正在尝试使用 MPC 为一种名为维特根 (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}") 时,它 returns 我只是
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 的作者回答了我的问题 here:
我只是把规则定义的部分从
" expr : <variable> | <remind> <variable> '}' | <variable> <assign> <expr>+ '}' ;"
至:
" expr : <remind> <variable> '}' | <variable> <assign> <expr>+ '}' | <variable>;"
发生这种情况是因为 mpc 中没有回溯,因此评估规则顺序很重要
我正在尝试使用 MPC 为一种名为维特根 (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}") 时,它 returns 我只是
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 的作者回答了我的问题 here:
我只是把规则定义的部分从
" expr : <variable> | <remind> <variable> '}' | <variable> <assign> <expr>+ '}' ;"
至:
" expr : <remind> <variable> '}' | <variable> <assign> <expr>+ '}' | <variable>;"
发生这种情况是因为 mpc 中没有回溯,因此评估规则顺序很重要