Разбор с библиотекой MPC возвращает ошибку при определении грамматики

Я пытаюсь использовать 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 '='

Я не могу найти ошибку, я уверен, что что-то неправильно определено в грамматике, но я не могу найти никакой подсказки в официальной документации или в примерах

2 ответа

Решение

Я получил ответ на свой вопрос от автора mpc здесь:

Я просто изменил часть определения правила с

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

чтобы:

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

это происходило потому, что в mpc нет возврата назад, поэтому важен порядок правил оценки

Я не эксперт по mpc и могу ошибаться, на самом деле у меня сейчас свои проблемы с ним, но я не думаю, что он поддерживает левую рекурсию. Таким образом, поскольку expr содержится в правиле expr, это вызывает ошибку.

Edit * Я смог решить мою проблему, переместив часть моего расширения. Таким образом, для вас эквивалентно было бы переместить переменную полностью вправо, чтобы она сначала пыталась проанализировать, используя два других расширения. Я не могу точно сказать, является ли это причиной вашей проблемы, но это может стоить того.

Другие вопросы по тегам