É possível extrair o primeiro e siga conjuntos de uma regra usando ANTLR4? Eu brinquei com isso um pouco em ANTLR3 e não encontrar uma solução satisfatória, mas se alguém tiver informações para uma ou outra versão, que seria apreciado.
Eu gostaria de analisar a entrada do usuário até a localização do cursor do usuário e, em seguida, fornecer uma lista de possíveis escolhas para a auto-realização. No momento, eu não estou interessado em fichas-completar de automóveis que são parcialmente inseridos. Eu quero mostrar todos os possíveis seguintes fichas em algum ponto no meio da análise.
Por exemplo:
sentence:
subjects verb (adverb)? '.' ;
subjects:
firstSubject (otherSubjects)* ;
firstSubject:
'The' (adjective)? noun ;
otherSubjects:
'and the' (adjective)? noun;
adjective:
'small' | 'orange' ;
noun:
CAT | DOG ;
verb:
'slept' | 'ate' | 'walked' ;
adverb:
'quietly' | 'noisily' ;
CAT : 'cat';
DOG : 'dog';
Dada a gramática acima ...
Se o usuário não tivesse digitado nada ainda a lista de preenchimento automático seria [ 'A'] (Note que eu teria que recuperar o primeiro lugar e não o FOLLOW da frase regra, uma vez que o acompanhamento da regra de base é sempre EOF).
Se a entrada foi A, a lista de preenchimento automático seria [ 'pequeno', 'laranja', 'gato', 'cão'].
Se a entrada foi O gato dormiu, a lista de preenchimento automático seria [ 'baixinho', 'ruidosamente', ''].
Então ANTLR3 fornece uma maneira de obter o conjunto de seguir fazendo isso:
BitSet followSet = state.following[state._fsp];
Isso funciona bem. I pode incorporar alguma lógica no meu analisador de modo que quando o analisador chama a regra em que o usuário está posicionado, ele recupera o seguinte dessa regra e, em seguida, fornece-los para o usuário. No entanto, isso não funciona tão bem para regras aninhadas (Por exemplo, a regra de base, porque o conjunto de follow ignora e sub-regra a seguir, como deveria).
Eu acho que eu preciso para fornecer o primeiro conjunto se o usuário tenha completado uma regra (que pode ser difícil de determinar), bem como o conjunto de Sequência de cobrir todas as opções válidas. Eu também acho que vou precisar para estruturar a minha gramática tal que dois tokens não são posteriores ao nível regra.
Eu teria que quebrar a regra acima firstSubject em algumas regras sub ...
a partir de
firstSubject:
'The'(adjective)? CAT | DOG;
para
firstSubject:
the (adjective)? CAT | DOG;
the:
'the';
Ainda estou para encontrar qualquer informação sobre como recuperar o primeiro conjunto a partir de uma regra.
ANTLR4 parece ter mudado drasticamente a forma como ele funciona com segue no nível do analisador gerado, então neste momento eu não tenho certeza se eu deveria continuar com ANTLR3 ou fazer o salto para ANTLR4.
Alguma sugestão seria muito apreciada.













