Pular para o conteúdo

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çãoNós que ela produz
ternarioTernaryExpression
coalesceCoalesceOp
comparacaoComparisonOp
aritmeticaBinaryOp, UnaryOp
lambdaLambdaExpression
pipelinePipelineExpression, SiftOperation, MorphOperation, DistillOperation
compreensaoListComprehension
colecoesListLiteral, SpreadElement, DictLiteral, TupleLiteral
conjuntoSetLiteral, SetComprehension
acessoSliceAccess, SafeMemberAccess
withWithExpression
spawnSpawnExpression
logicoLogicalOp, NotOp, BooleanLiteral
tipos_em_execucaoCastExpression, 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"] ?? 0

comparacao#

text
comparacao    = soma [ ( "is" | "isnt" | "bigger" | "smaller" | "bigger_eq"
                      | "smaller_eq" | "in" | "not" "in" ) soma ] ;
dataforge
x := 3 bigger_eq 2

aritmetica#

text
soma          = produto { ( "+" | "-" ) produto } ;
produto       = unario { ( "*" | "/" | "%" | "~/" ) unario } ;
unario        = ( "-" | "+" ) unario | potencia ;
potencia      = posfixo [ "**" unario ] ;
dataforge
x := -2 ** 2 + 7 ~/ 2

lambda#

text
lambda        = "lambda" [ parametros ] ( ":" | "=>" ) expressao ;
dataforge
f := lambda x: x * 2
g := lambda a, b => a + b

pipeline#

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 0

compreensao#

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?.nome

with#

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 no

tipos_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.