2012-08-30 15 views
7

Esto debería ser bastante simple. Estoy trabajando en una gramática más lexer utilizando ANTLR, y quiero limitar la longitud máxima de los identificadores de variable a 30 caracteres. Me trató de lograr esto con esta línea (después de expresiones regulares normales - con excepción de la '' cosa - sintaxis):Sintaxis del cuantificador de rango en ANTLR Regex

ID : ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'){0,29} {System.out.println("IDENTIFIER FOUND.");} 
    ; 

No hay errores en la generación de código, pero la compilación falló debido a una línea en el código generado que era simplemente :

0,29

Obviamente antlr está tomando la sección de texto entre los paréntesis y colocándola en el área de estado de aceptar, junto con la línea de impresión. Busqué en el sitio ANTLR, y no encontré ningún ejemplo o referencia a una expresión equivalente. ¿Cuál debería ser la sintaxis de esta expresión?

Respuesta

8

ANTLR no es compatible con la sintaxis del cuantificador {m,n}. ANTLR ve el {} de su cuantificador y no puede diferenciarlos del {} que rodea sus acciones.

Soluciones:

  1. impone un límite de vista semántico. Deje que reúna un ID de tamaño ilimitado y que luego se queje/trunque como parte de su código de acción o más adelante en el compilador.
  2. Crea las reglas de cuantificación de forma manual.

Este es un ejemplo de una regla manual que limita los ID a 8.

SUBID : ('a'..'z'|'A'..'Z'|'0'..'9'|'_') 
     ; 
ID : ('a'..'z'|'A'..'Z') 
    (SUBID (SUBID (SUBID (SUBID (SUBID (SUBID SUBID?)?)?)?)?)?)? 
    ; 

Personalmente, me gustaría ir con la solución semántica (# 1). En estos días hay muy pocas razones para limitar los identificadores en un idioma, y ​​aún menos razones para causar un error de sintaxis (aborto anticipado de la compilación) cuando se viola dicha regla.

+0

Gracias por su ayuda. – user1634761

+1

Si se usaron ANTLR solo para generar compiladores para lenguajes de programación, entonces puede haber poco uso para los cuantificadores. Pero una gramática (esquema) para validar cualquier tipo de datos estructurados ciertamente los necesita: los números de las tarjetas de crédito son 16 dígitos, no 13 o 25. El libro ANTLR4 tiene gramáticas JSON y XML, pero sin restricciones básicas de token sería difícil usar un Gramática ANTLR como una versión abstracta (independiente del códec) de JSON Schema y XSD. – Dave

+0

"Hoy en día hay muy pocas razones para limitar los identificadores en un idioma", eso no significa que no existan idiomas con identificadores limitados, ni que las personas quieran escribir analizadores para ellos. –

Cuestiones relacionadas