Я пытаюсь написать грамматику, но у меня возникла проблема, которая я не совсем знаю, как решить «элегантно».
Проблема в том, что у меня есть 'bro' в качестве зарезервированного ключевого слова инструкции, и за ним может следовать (или нет) оператор предикации. IE: 'bro_t' или 'bro'.
Теперь проблема в том, что в настоящее время 'bro_t' соответствует определению для ID, в то время как 'bro' сам по себе является токеном, и очевидно, что 'bro_t' длиннее, чем 'bro', поэтому анализатор соответствует этому выражению к идентификатору и разбора не получается. Решения, которые я придумала, - это сделать 'bro_t' и 'bro_f' зарезервированными, но это будет относительно много времени для всего набора команд. Другое решение, на которое я смотрел, было с подстановочными операторами, но я не совсем понимаю, применимы ли они здесь, и если да, то как их применять.
Грамматика:
predicate
: '_t' '<' register '>' | '_f' '<' register '>' | ;
operation
: 'bro' predicate ;
ID: ('a' .. 'z' | 'A' .. 'Z' | '_') ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '$' | '.')* ;