Pegjs: Operadores não gananciosos para *, + e?

Criado em 7 out. 2011  ·  7Comentários  ·  Fonte: pegjs/pegjs

Tenho uma linguagem em que existem instâncias repetidas do mesmo padrão, em que só me preocupo com o primeiro símbolo. Por exemplo:

          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 exemplo simples pode ser correspondido por este padrão (onde _ é um espaço em branco):

identifier _ "OBJECT IDENTIFIER" _ "::=" _ "{" _ identifier _ number _ "}"

Isso não é grande coisa neste caso (eu já digitei o padrão :-) Mas a linguagem tem um conjunto de outras construções complicadas que não garantem a análise completa (eu só quero o identificador inicial em cada linha para fazer o trabalho que tenho em mente).

Eu gostaria de digitar algo como este padrão:

identifier _ "OBJECT IDENTIFIER" .*? "}"

onde o ".*?" não é guloso - só consome até a primeira ocorrência do terminal. Isso poderia estar na lista para PEG.js? Muito Obrigado.

Comentários muito úteis

No formalismo PEG , você pode combinar facilmente até um terminador usando um predicado junto com o metacaractere . . Algo como:

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

Isso é suficiente para você?

Todos 7 comentários

Atualização: isso poderia ser satisfeito por uma contagem de repetição (que é uma generalização do meu pensamento inicial), conforme sugerido nos Grupos do Google em: http://groups.google.com/group/pegjs/browse_thread/thread/2bea15581be45187

No formalismo PEG , você pode combinar facilmente até um terminador usando um predicado junto com o metacaractere . . Algo como:

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

Isso é suficiente para você?

Sim, funciona perfeitamente. Obrigado!

@dmajda Qual é a prática recomendada para remover o caractere vazio retornado pela expressão !"}" ?

Por exemplo:

   = chars:(!"-suffix" .)+ "-suffix"

"foo-suffix" => [[ '', 'f' ], ['', 'o' ], ['', 'o' ]]  // result
"foo-suffix" => ['f', 'o', 'o' ] // desired result

Consegui fazer isso quebrando !"-suffix" . em sua própria regra que apenas retorna o resultado . , mas estou curioso para saber se há uma maneira melhor.

66 vai consertar isso.

Eu acho que enquanto isso você pode usar:

    = chars:(!"-suffix" c:. {return c})+ "-suffix"

@islandr Por favor, não use os problemas como um lugar para fazer perguntas sobre o uso do PEG.js. Especialmente quando eles estão fechados e especialmente quando você está pedindo algo que outras pessoas ao meu lado possam ajudá-lo. O canal adequado é o Grupo do

Desculpe David. Achei que seria um bom lugar, já que era
diretamente relacionado ao exemplo que você deu.

Na quarta-feira, 9 de janeiro de 2013 às 21:51, David Majda [email protected] :

@islandr https://github.com/islandr Não use questões como um lugar
para fazer perguntas sobre o uso do PEG.js. Especialmente quando eles estão fechados e
especialmente quando você está perguntando algo que outras pessoas ao meu lado podem
te ajudar. O canal adequado é o Google Grouphttp: //groups.google.com/group/pegjs
.

-
Responda diretamente a este e-mail ou visualize-o em Gi tHubhttps: //github.com/dmajda/pegjs/issues/57#issuecomment -12083927.

Esta página foi útil?
0 / 5 - 0 avaliações