Ключевые слова инструкции Antlr4 и сопоставление с самым длинным оператором - PullRequest
1 голос
/ 08 апреля 2020

Я пытаюсь написать грамматику, но у меня возникла проблема, которая я не совсем знаю, как решить «элегантно».

Проблема в том, что у меня есть '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' | '_' | '$' | '.')* ;

1 Ответ

0 голосов
/ 08 апреля 2020

Почему бы не сделать:

operation
 : BRO '<' register '>'
 ;

BRO : 'bro' ( '_' [a-z]+ )?
ID  : [a-zA-Z_] [a-zA-Z0-9_$.]*;

?

...