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.
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.
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.
Comentários muito úteis
No formalismo PEG , você pode combinar facilmente até um terminador usando um predicado junto com o metacaractere
.
. Algo como:Isso é suficiente para você?