Pegjs: Operadores no codiciosos para *, + y?

Creado en 7 oct. 2011  ·  7Comentarios  ·  Fuente: pegjs/pegjs

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.

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:

"OBJECT IDENTIFIER" (!"}" .)* "}"

¿Es eso suficiente para ti?

Todos 7 comentarios

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.

66 solucionará esto.

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

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

dmajda picture dmajda  ·  15Comentarios

StoneCypher picture StoneCypher  ·  8Comentarios

marek-baranowski picture marek-baranowski  ·  6Comentarios

Coffee2CodeNL picture Coffee2CodeNL  ·  13Comentarios

StoneCypher picture StoneCypher  ·  6Comentarios