Pergunta

O que é a maneira correta de resolver este problema em ANTLR:

Eu tenho uma regra de gramática simples, digamos, por uma lista com um número arbitrário de elementos.

list
: '[]' 
| '[' value (COMMA value)* ']'

Se eu quisesse atribuir um valor de retorno para lista, e ter esse valor ser a lista real de valores devolvidos a partir da produção, o que é a maneira correta de fazê-lo? As alternativas Estou entretenimento são:

  • criar a minha própria pilha no escopo global para acompanhar estas listas
  • Tente inspecionar os nós da árvore abaixo de mim e extrair informações de que maneira
  • Acesso lo de alguma liso e fresco maneira que eu estou esperando para saber mais sobre em que eu possa ter acesso fácil a essa lista a partir de dentro a ação associada com a regra.

Eu acho que a pergunta é: Como é que as crianças legais fazê-lo

(FYI Eu estou usando a API do Python para ANTLR, mas se você me bateu com uma outra língua, eu posso lidar com isso)

Foi útil?

Solução

Em C # que pode ter esta aparência:

list returns [ List<string> ValueList ]
    @init
    {
        $ValueList = new List<string>();
    }
    : '[]'
    | '[' value {$ValueList.Add(value);} (COMMA value {$ValueList.Add(value);})* ']'
    ;

Outras dicas

Eu acho que a maneira mais simples poderia ser

list returns [ List values ]
: '[]' 
| '[' vs+=value (COMMA vs+=value)* ']' {
        $values = $vs;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top