Obtendo Primeiro e Siga metadados de um analisador ANTLR4

votos
2

É 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.

Publicado 30/10/2013 em 19:17
fonte usuário
Em outras línguas...                            


1 respostas

votos
6

ANTLRWorks 2 (AW2) executa uma operação similar, que vou descrever aqui. Se você faz referência o código fonte para AW2, tenha em mente que ele só é liberado sob uma licença LGPL.

  1. Criar um símbolo especial que representa o local de interesse para a conclusão do código.

    • De certa forma, este token se comporta como o EOF. Em particular, a ParserATNSimulator não consome este token; uma decisão é sempre feito em ou antes de ser alcançado.
    • Em outros aspectos, esse símbolo é muito original. Em particular, se o token está localizado em um identificador ou palavra-chave, ela é tratada como se o tipo de token foi "distorcido", e permitiu para combinar com qualquer identificador ou palavra-chave para o idioma. Para ANTLR 4 gramáticas, se o token acento circunflexo está localizado em um local onde o usuário digitou g, o analisador irá permitir que token para coincidir com um nome de regra ou a palavra-chave grammar.
  2. Criar um intérprete ATN especializado que pode retornar todas as árvores de análise possíveis que levam o acento circunflexo forma, sem olhar passado o acento circunflexo para qualquer decisão, e sem restringir o tipo de token exata do símbolo acento circunflexo.

  3. Para cada árvore de análise possível, avaliar a sua conclusão de código no contexto de qualquer que seja o símbolo acento circunflexo combinados em uma regra de analisador.

  4. A união de todos os resultados encontrados no passo 3 é um superconjunto do conjunto completo de resultados de conclusão de código válidos, e pode ser apresentado no IDE.

O seguinte descreve a implementação das etapas acima do AW2.

  1. Em AW2, este é o CaretToken, e sempre tem o tipo de token CARET_TOKEN_TYPE.
  2. Em AW2, esta operação especializada é representado pela ForestParser<TParser>interface, com a maior parte da implementação reutilizável em AbstractForestParser<TParser>e especializadas para analisar ANTLR 4 gramáticas para conclusão de código no GrammarForestParser.
  3. Em AW2, esta análise é realizada principalmente por GrammarCompletionQuery.TaskImpl.runImpl(BaseDocument).
Respondeu 30/10/2013 em 20:39
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more