Gramática — Expressões
14 produções: operadores, chamadas, coleções, pipeline. Cada exemplo é aceito pelo parser.
Uma expressão produz um valor. A ordem em que os operadores ligam está na tabela de precedência, e cada nível ali é conferido pela forma da árvore.
| Produção | Nós que ela produz |
|---|---|
ternario | TernaryExpression |
coalesce | CoalesceOp |
comparacao | ComparisonOp |
aritmetica | BinaryOp, UnaryOp |
lambda | LambdaExpression |
pipeline | PipelineExpression, SiftOperation, MorphOperation, DistillOperation |
compreensao | ListComprehension |
colecoes | ListLiteral, SpreadElement, DictLiteral, TupleLiteral |
conjunto | SetLiteral, SetComprehension |
acesso | SliceAccess, SafeMemberAccess |
with | WithExpression |
spawn | SpawnExpression |
logico | LogicalOp, NotOp, BooleanLiteral |
tipos_em_execucao | CastExpression, TypeofExpression |
ternario#
text
ternario = coalesce [ "given" expressao "otherwise" expressao ] ;dataforge
r := "par" given 4 % 2 is 0 otherwise "impar"coalesce#
text
coalesce = logico_ou { "??" logico_ou } ;dataforge
v := {}
x := v["k"] ?? 0comparacao#
text
comparacao = soma [ ( "is" | "isnt" | "bigger" | "smaller" | "bigger_eq"
| "smaller_eq" | "in" | "not" "in" ) soma ] ;dataforge
x := 3 bigger_eq 2aritmetica#
text
soma = produto { ( "+" | "-" ) produto } ;
produto = unario { ( "*" | "/" | "%" | "~/" ) unario } ;
unario = ( "-" | "+" ) unario | potencia ;
potencia = posfixo [ "**" unario ] ;dataforge
x := -2 ** 2 + 7 ~/ 2lambda#
text
lambda = "lambda" [ parametros ] ( ":" | "=>" ) expressao ;dataforge
f := lambda x: x * 2
g := lambda a, b => a + bpipeline#
text
pipeline = ternario { ">>" operacao } ;
operacao = "sift" nome ":" expressao | "morph" nome ":" expressao
| "distill" nome "," nome ":" expressao expressao
| verbo_de_quadro ;dataforge
t := [1, 2, 3] >> sift n: n bigger 1 >> morph n: n * 10 >> distill a, v: a + v 0compreensao#
text
compreensao = "[" expressao "cycle" nome "in" expressao [ "given" expressao ] "]" ;dataforge
q := [n * n cycle n in [1, 2, 3] given n bigger 1]colecoes#
text
cluster = "[" [ item { "," item } ] "]" ;
vault = "{" [ chave ":" expressao { "," chave ":" expressao } ] "}" ;
tupla = "(" expressao "," [ expressao { "," expressao } ] ")" ;
item = [ "..." ] expressao ;dataforge
xs := [1, 2]
ys := [...xs, 3]
v := {"a": 1}
t := (1, "a")conjunto#
text
conjunto = "{" item { "," item } [ "," ] "}"
| "{" expressao "cycle" nome "in" expressao [ "given" expressao ] "}" ;
vazio = "set" "(" [ expressao ] ")" ;dataforge
cores := {"azul", "verde", "azul"}
pares := {n * n cycle n in [1, 2, 3]}
nenhum := set()acesso#
text
posfixo = primario { "." nome | "?." nome | "(" argumentos ")"
| "[" indice "]" } ;
indice = expressao | [ expressao ] ":" [ expressao ] [ ":" [ expressao ] ] ;dataforge
xs := [1, 2, 3]
out xs[1:3], xs[::-1]
o := void
out o?.nomewith#
text
copia = expressao "with" vault ;dataforge
record P:
x: Integer
p := P(1)
q := p with {"x": 2}spawn#
text
spawn = ( "spawn" | "forge" ) nome "(" [ argumentos ] ")" ;dataforge
blueprint B:
x := 1
b := spawn B()
c := forge B()logico#
text
logico_ou = logico_e { "or" logico_e } ;
logico_e = negacao { "and" negacao } ;
negacao = "not" negacao | comparacao ;
booleano = "yes" | "no" | "void" ;dataforge
out yes and "segundo", 0 and 9, not notipos_em_execucao#
text
conversao = "cast" expressao "as" tipo ;
tipo_de = "typeof" "(" expressao ")" ;dataforge
out cast "42" as Integer, typeof([1])Estas produções saem de dataforge/gramatica.py. No terminal: dataforge gramatica expressoes. Volte para a gramática.