cparsingbnfmpc

Parsing with MPC library returns error on grammar definition


I'm trying to use MPC to define a grammar for a language called Wittgen (https://esolangs.org/wiki/Wittgen)

I defined the following grammar:

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);

when I try to input a variable or a remind operator (like "foo247" or "@foo247}") it parses it correctly, but when I try to parse an assignment ("foo247=foo}"), it returns me just

WITTGEN> foo357=foo}
<stdin>:1:7: error: expected one of 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ', one or more of one of 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ', '@' or end of input at '='

I can't find the error, I'm sure something is wrong defined in the grammar, but I can't find any clue in the official documentation or in the examples


Solution

  • I had my question answered from the author of mpc here:

    I simply changed the part of rule definition from

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

    to:

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

    it was happening because there's no backtracking in mpc, so the evaluation rule order is important