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 ルール内に含まれているため、エラーが発生します。

編集*拡張の一部を移動することで問題を解決できました。したがって、変数を右端まで移動して、最初に他の 2 つの展開を使用して解析しようとするのと同等です。それが問題の原因かどうかはわかりませんが、試してみる価値はあります。

于 2017-01-05T00:01:30.273 に答える