A gramática, de dentro de um programa
Arcane.Gramatica e dataforge gramatica — perguntar à linguagem como ela é.
Um editor, um formatador ou um gerador de documentação escrito em DataForge não precisa manter uma cópia da gramática: ele pergunta à linguagem. Arcane.Gramatica expõe as produções, a precedência, os tokens e a validação — com o lexer e o parser de verdade, e sem executar nada.
dataforge
adopt Arcane.Gramatica as G
out len(G.producoes()), "producoes em", len(G.grupos()), "grupos"
out G.producao("guard")["ebnf"]
// Quem liga mais forte? A resposta sai da arvore.
assert G.raiz("1 + 2 * 3") is ["BinaryOp", "+"]
// O que o parser entendeu, instrucao por instrucao.
assert G.instrucoes("x := 1\nout x") is ["Assignment", "OutStatement"]
// Validar o texto que um usuario digitou — sem executa-lo.
r := G.validar("x := (1 +")
assert not r["ok"]
out $"linha {r['erros'][0]['linha']}: {r['erros'][0]['mensagem']}"
assert "cycle" in G.palavras()["reservadas"]
assert "route" in G.palavras()["contextuais"]| Função | Devolve |
|---|---|
producoes(grupo) | as produções — nome, EBNF, exemplo, nós, nota |
producao(nome) | uma; o nome errado é recusado com sugestão |
grupos() / ebnf(grupo) | os grupos; o texto EBNF |
precedencia() | a escada, da mais fraca para a mais forte |
raiz(expressao) | a classe e o operador na raiz da árvore |
tokens(texto) | o que o lexer viu, com linha e coluna |
instrucoes(texto) | a classe de cada instrução de topo |
validar(texto) | {ok, instrucoes, erros} — sem executar |
palavras() | as reservadas e as contextuais |
No terminal#
bash
dataforge gramatica # os grupos
dataforge gramatica pipeline # uma producao: EBNF, exemplo, nota
dataforge gramatica expressoes --ebnf # o EBNF de um grupo
dataforge gramatica --ebnf # a gramatica inteira
dataforge gramatica --precedencia # quem liga mais forte
dataforge gramatica --json # como dado