Допустим, у нас есть лексер и грамматика некоего DSL. Мы хотим сделать хорошую интерактивную среду, как у «взрослых»: чтобы аргументы у функций предлагались, исходя из контекста.
То есть, если есть правило
let_stmnt:
TOK_LET TOK_IDENTIFIER TOK_ASSIGN expr;
Иными словами, мне нужно каким-то образом достучаться до всех возможных незавершенных вариантов разбора части набранного выражения. Пока я не придумал ничего лучше, как
let_stmnt:
TOK_LET variable TOK_ASSIGN expr;
variable:
TOK_IDENTIFIER { add_completion(COML_VAR, @$); }
В процессе гугления находил только рекомендации использовать push parser для такого, но без конкретики или примеров.
Ну и вообще, для «дружественного DSL» хотелось бы более понятных сообщений об ошибке, нежели «expected expr», ведь из частично заматчившихся правил можно сузить набор возможных на данной позиции лексем.