LPeg - Criando gramáticas facilmente

Olá!
Ultimamente tenho voltado a dar uma lida na documentação da linguagem Lua, a versão 5.1. Tempos atrás (no começo de 2007) eu tinha iniciado com esta linguagem.

Tenho visto especialmente o suporte a Parsing Expression Grammars (PEGs), o que não é encontrado em outras linguagens, e que fornece um poderoso recurso para criação de gramáticas na linguagem. Irei demonstrar um simples uso, com uma gramática bem básica, apenas para ilustrar o que podemos fazer com ela.

require 'lpeg'
 
function verifica_email(t)
	if t then 
		print(unpack(t))
	else
		print('Formato inválido!')
	end
end
 
-- Gramática
email = lpeg.P{
	-- Aqui indicamos a regra inicial
	lpeg.V'mail';
	-- Regra geral para caracteres válidos
	chars  = lpeg.R('az')^1;
	-- Regra que dita todo o formato esperado
	mail   = lpeg.Ct(lpeg.C(lpeg.V'chars') * '@' * lpeg.V'domain');
	-- Regra para parte do domínio juntamente com TDL
	domain = lpeg.C(lpeg.V'chars' * ('.' * lpeg.V'chars')^1);
}
 
verifica_email(lpeg.match(email, '---@---.com'))
verifica_email(lpeg.match(email, 'foo@bar.baz.com'))

Apenas para esclarecer um pouco, embora a documentação explique cada parte. Para quem está familiarizado com regex, ^1 seria o mesmo que o +, ou seja, casa no mínimo 1 caractere. O * não é o mesmo da regex, aqui ele significa "e". Você poderia pensar que o '+' seja mais apropriado, mas ele é usado para indicar "ou". lpeg.Ct() foi usada para criar uma tabela com os grupos que são capturados usando lpeg.C().

Então testando teremos:

Formato inválido!
foo     bar.baz.com

Simples, não?! :D

show! precisamos do peg em

show!

precisamos do peg em outras linguagens :>

talvez um pypeg! hah

abraços

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

More information about formatting options