Pergunta

Eu tenho que definir a gramática de um arquivo como a mostrada abaixo.

// arquivo Sample
NameCount = 4
Nome = a
Name = b
Name = c
Name = d
// Fim do arquivo

Agora eu sou capaz de definir fichas para NameCount e Nome . Mas eu tenho que definir a estrutura do arquivo, incluindo o número válido de instâncias de símbolo Nome , que é o valor após NameCount . Eu tenho o valor analisado e convertido em um inteiro e armazenado em uma variável no escopo global da gramática (dizer na variável nc ).

Como definir na gramática que Nome deve repetir exatamente nc vezes?

Foi útil?

Solução

Isto não pode ser expressa na própria gramática. Se o número foi de correção que você poderia expressar o número de tokens esperados. Mas as mudanças de fluxo de token com base no valor. O que você pode fazer é incluir isso em combinação lexer / parser. Mas você não pode criar essa construção por apenas a sintaxe gramática simples. Você provavelmente vai querer algo ao longo das linhas de

grammar test;

@members {
  private int count = 0;
  private int names = 0;
}

file
    : count (name)+
      {
        if (count != names) throw new Exception("");
      }
    ;

count
    : 'NameCount' EQ Number
      {
        count = Integer.parseInt($Number.text);
      }
    ;

name
    : 'Name' EQ Value
      {
        names++;
      }
...

Outras dicas

Eu não estou certo de que este é uma gramática livre de contexto. Se não for, você não pode dizer ANTLR para analisar a linguagem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top