Разбор с библиотекой 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 * Я смог решить мою проблему, переместив часть моего расширения. Таким образом, для вас эквивалентно было бы переместить переменную полностью вправо, чтобы она сначала пыталась проанализировать, используя два других расширения. Я не могу точно сказать, является ли это причиной вашей проблемы, но это может стоить того.