Tengo un lenguaje donde hay instancias repetidas del mismo patrón donde solo me importa el primer símbolo. Por ejemplo:
system OBJECT IDENTIFIER ::= { mib-2 1 }
interfaces OBJECT IDENTIFIER ::= { mib-2 2 }
at OBJECT IDENTIFIER ::= { mib-2 3 }
ip OBJECT IDENTIFIER ::= { mib-2 4 }
icmp OBJECT IDENTIFIER ::= { mib-2 5 }
tcp OBJECT IDENTIFIER ::= { mib-2 6 }
udp OBJECT IDENTIFIER ::= { mib-2 7 }
egp OBJECT IDENTIFIER ::= { mib-2 8 }
Este simple ejemplo podría coincidir con este patrón (donde _ es un espacio en blanco):
identifier _ "OBJECT IDENTIFIER" _ "::=" _ "{" _ identifier _ number _ "}"
Esto no es tan importante en este caso (ya escribí el patrón :-) Pero el lenguaje tiene un conjunto de otras grandes construcciones peludas que no garantizan el análisis completo (solo quiero que el identificador inicial en cada línea sea hacer el trabajo que tengo en mente).
Me gustaría escribir algo como este patrón:
identifier _ "OBJECT IDENTIFIER" .*? "}"
donde el ".*?" no es codicioso: solo consume hasta la primera aparición del terminal. ¿Podría estar en la lista de PEG.js? Muchas gracias.
Actualización: esto podría satisfacerse con un recuento de repeticiones (que es una generalización de mi pensamiento inicial) como se sugiere en Grupos de Google en: http://groups.google.com/group/pegjs/browse_thread/thread/2bea15581be45187
En el formalismo PEG , puede hacer coincidir fácilmente hasta un terminador usando un predicado junto con el metacarácter .
. Algo como:
"OBJECT IDENTIFIER" (!"}" .)* "}"
¿Es eso suficiente para ti?
Sí, eso funciona perfectamente. ¡Gracias!
@dmajda ¿Cuál es la práctica recomendada para eliminar el carácter vacío devuelto por la expresión !"}"
?
Por ejemplo:
= chars:(!"-suffix" .)+ "-suffix"
"foo-suffix" => [[ '', 'f' ], ['', 'o' ], ['', 'o' ]] // result
"foo-suffix" => ['f', 'o', 'o' ] // desired result
Pude lograr esto rompiendo !"-suffix" .
en su propia regla que solo devuelve el resultado .
, pero tengo curiosidad por saber si hay una manera mejor.
Creo que mientras tanto puedes usar:
= chars:(!"-suffix" c:. {return c})+ "-suffix"
@islandr No utilice los problemas como un lugar para hacer preguntas sobre el uso de PEG.js. Especialmente cuando están cerrados y especialmente cuando preguntas algo en lo que otras personas a mi lado pueden ayudarte. El canal adecuado es el Grupo de Google .
Lo siento David. Pensé que este habría sido un buen lugar ya que estaba
directamente relacionado con el ejemplo que ha dado.
El miércoles 9 de enero de 2013 a las 9:51 p.m., David Majda [email protected] escribió:
@islandr https://github.com/islandr No utilice los problemas como un lugar
para hacer preguntas sobre el uso de PEG.js. Especialmente cuando están cerrados y
especialmente cuando preguntas algo que otras personas a mi lado pueden
ayudarte con. El canal adecuado es Google Grouphttp: //groups.google.com/group/pegjs
.-
Responda a este correo electrónico directamente o véalo en Gi
Comentario más útil
En el formalismo PEG , puede hacer coincidir fácilmente hasta un terminador usando un predicado junto con el metacarácter
.
. Algo como:¿Es eso suficiente para ti?