Pregunta

Tengo que definir la gramática de un archivo como el que se muestra a continuación.

// Archivo de muestra
NameCount = 4
Nombre = una
Nombre = b
Nombre = c
Nombre = d
// Fin del archivo

Ahora puedo definir tokens para NameCount y Name . Pero tengo que definir la estructura del archivo, incluido el número válido de instancias de token Name , que es el valor después de NameCount . Tengo el valor analizado y convertido en un entero y almacenado en una variable en el ámbito global de la gramática (por ejemplo, en la variable nc ).

¿Cómo definir en gramática que Nombre debería repetirse exactamente nc veces?

¿Fue útil?

Solución

Esto no puede expresarse en la gramática misma. Si el número fue fijo, podría expresar el número de tokens esperados. Pero la secuencia de tokens cambia según el valor. Lo que puede hacer es incluir esto en la combinación lexer / parser. Pero no puede crear esta construcción simplemente con la sintaxis gramatical simple. Probablemente quieras algo similar a

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++;
      }
...

Otros consejos

No estoy seguro de que sea una gramática libre de contexto. Si no es así, no puede decirle a ANTLR que analice el idioma.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top