Compartilhar via


Gramática de expressão

Observação

Microsoft Power Fx é o novo nome da linguagem de fórmula para aplicativos de tela. Esses artigos são um trabalho em andamento à medida que extraímos a linguagem de aplicativos de tela, integramos a linguagem a outros produtos do Microsoft Power Platform e disponibilizamo-na como software livre. Comece com o artigo Visão geral do Microsoft Power Fx para ver uma introdução à linguagem.

O Microsoft Power Fx baseia-se em fórmulas que associam um nome a uma expressão. Assim como nas planilhas do Excel, conforme as dependências de entrada para a expressão mudam, a expressão é recalculada e o valor do nome muda, possivelmente fazendo o recálculo em cascata para outras fórmulas.

Esta gramática cobre a parte da expressão da fórmula. A associação a um nome para criar uma fórmula depende de como o Power Fx está integrado. Nas planilhas, a sintaxe de associação não é exposta, é implícita pelo local onde a expressão é gravada, por exemplo, inserindo =B1 na célula A1. Em alguns casos, nenhuma associação é necessária e o Power Fx é usado como um avaliador de expressão, por exemplo, no suporte a colunas calculadas de uma tabela de banco de dados. Para o Power Apps, a associação é implícita ao trabalhar no Power Apps Studio com um formato de serialização baseado em YAML para uso fora do Power Apps Studio.

Convenções gramaticais

As gramáticas lexical e sintática são apresentadas usando produções gramaticais. Cada produção de gramática define um símbolo não terminal e as possíveis expansões desse símbolo não terminal em sequências de símbolos terminais ou não terminais. Em produções de gramática, os símbolos não terminais são mostrados em itálico e os símbolos terminais são mostrados em uma fonte de largura fixa.

A primeira linha de uma produção de gramática é o nome do símbolo não terminal que está sendo definido, seguido por dois-pontos. Cada linha recuada sucessiva contém uma possível expansão do símbolo não terminal fornecido como uma sequência de símbolos terminais ou não terminais. Por exemplo, a produção:

  Identificador Global:
    [@Identificador]

define um GlobalIdentifier para consistir no token [@, seguido por um Identificador, seguido pelo token ].

Quando há mais de uma expansão possível de um símbolo não terminal, as alternativas são listadas em linhas separadas. O "opt" subscrito é usado para indicar um símbolo opcional. Por exemplo, a produção:

  Chamada de função:
    FunctionIdentifier(Argumentos da funçãoopt)

é uma versão abreviada de:

  Chamada de função:
    Identificador de Função()
    FunctionIdentifier(Argumentos da função)

As alternativas normalmente são listadas em linhas separadas, porém, nos casos em que há muitas alternativas, a frase "um de" poderá preceder uma lista de expansões dadas em uma única linha. Isso é simplesmente uma forma mais prática do que listar cada uma das alternativas em linhas separadas.

Por exemplo, a produção:

  DecimalDigit:um dos
    0123456789

é uma versão abreviada de:

  DígitoDecimal:
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9

Análise léxica

A produção da unidade lexical define a gramática lexical para uma expressão do Power Fx. Cada expressão válida do Power Fx atende a essa gramática.

  Unidade de expressão:
    Elementos de Expressãoopt

  Elementos de expressão:
    ExpressãoElemento
    Elemento de expressãoElementos de expressãoopt

  Elemento de expressão:
    Espaço em branco
    Comentário

No nível lexical, uma expressão do Power Fx consiste em um fluxo de elementos de Espaço em branco, Comentário e Token. Cada uma dessas produções é abordada nas seções a seguir. Somente os elementos Token são relevantes na gramática sintática.

Espaço em branco

O espaço em branco é usado para separar comentários e tokens em um documento do Power Apps.

  Espaço em branco:
    qualquer separador de espaço Unicode (classe Zs)
    qualquer separador de espaço Unicode (classe Zl)
    qualquer separador de parágrafo Unicode (classe Zp)
    Caractere de guia horizontal (U+0009)
    Caractere de feed de linha (U+000A)
    Caractere de tabulação vertical (U+000B)
    Caractere de feed de formulário (U+000C)
    Caractere de retorno de carro (U+000D)
    Caractere de próxima linha (U+0085)

Comentários

Duas formas de comentários são aceitas:

  • Comentários de linha única que começam com os caracteres // e se estendem até o final da linha de origem.
  • Comentários delimitados que começam com os caracteres /* e terminam com os caracteres */. Os comentários delimitados podem abranger várias linhas.

  Comentário:
    Comentário Delimitado
    Comentário de linha única

  Comentário de linha única:
    //SingleLineCommentCharactersopt

  SingleLineCommentCharacters:
    CaractereCommentLinhaSingle
    SingleLineCommentCharacterCaracteres de comentário de linha únicaopt

  CaractereCommentLinhaSingle:
    qualquer caractere Unicode, exceto um NewLineCharacter

  ComentárioDelimitado:
    /*DelimitedCommentCharactersopt*/

  DelimitedCommentCharacters:
    CaracteresDelimitadosCommentSemAsteriscoCaracteresDelimitadosCommentopt
    *DelimitedCommentAfterAsteriscoCaracteres

  DelimitedCommentAfterAsteriskCharacters:
    DelimitedCommentNoSlashAsteriskCharacterDelimitedCommentCharactersopt
    *DelimitedCommentAfterAsteriscoCaracteres

  DelimitedCommentCharactersNoAsterisk:
    qualquer caractere Unicode, exceto * (asterisk)

  DelimitedCommentNoSlashAsteriskCharacter:
    qualquer caractere Unicode, exceto / (barra) ou * (asterisco)

Os comentários não estão aninhados. As sequências de caracteres /* e */ não têm nenhum significado especial dentro de um comentário de linha única, e as sequências de caracteres // e /* não têm nenhum significado especial dentro de um comentário delimitado.

Os comentários não são processados em cadeias de caracteres literais de texto.

O exemplo a seguir inclui dois comentários delimitados:

/* Hello, world
*/
"Hello, world"    /* This is an example of a text literal */

Os exemplos a seguir incluem três comentários de uma única linha:

// Hello, world
//
"Hello, world"    // This is an example of a text literal

Literais

Um literal é uma representação de código-fonte de um valor.

  Literalmente:
    LógicoLiteral
    NúmeroLiteral
    TextoLiteral

Literais lógicos

Um literal lógico é usado para gravar os valores verdadeiro e falso e produz um valor lógico.

  LogicalLiteral:um dos
    truefalse

Literais numéricos

Um literal de número é usado para escrever um valor numérico e produz um valor de número.

  NúmeroLiteral:
    DígitosDecimaisParteExponenteopt
    DígitosDecimaisSeparadorDecimalDígitosDecimaisoptParteExponenteopt
    SeparadorDecimalDígitosDecimaisParteExponenteopt

  Dígitos decimais:
    Dígito decimal
    DígitosDecimaisDígitosDecimais

  DecimalDigit:um de
    0123456789

  ParteExponente:
    ExponentIndicatorSinaloptDígitos Decimais

  ExpoenteIndicator:um de
    eE

  Sinal:um dos
    +-

Literais de texto

Um literal de texto é usado para escrever uma sequência de caracteres Unicode e produz um valor de texto. Literais de texto são colocados entre aspas duplas. Para incluir aspas duplas no valor do texto, repita as aspas duplas, conforme mostrado no exemplo a seguir:

"The ""quoted"" text" // The "quoted" text

  TextoLiteral:
    "TextoCaracteresLiteraisopt"

  CaracteresLiteraisDeTexto:
    CaractereLiteralTextoCaracteresLiteraisTextooptar

  CaractereLiteralTexto:
    CaractereTextoSemAspasDuplas
    Sequência de escape de aspas duplas

  TextCharacterNoDoubleQuote:
    qualquer ponto de código Unicode, exceto aspas duplas

  DoubleQuoteEscapeSequence:
    ""

Identificadores

Um identificador é um nome usado para fazer referência a um valor. Os identificadores podem ser identificadores comuns ou identificadores entre aspas simples.

  Identificador:
    IdentifierNamemasnãooperadorouContextKeyword

  Nome do Identificador:
    IdentificadorStartCharacterIdentificadorContinueCharactersopt
    'Identificador de Aspas Simples'

  IdentificadorStartCharacter:
    LetraPersonagem
    _

  IdentificadorContinueCharacter:
    IdentificadorStartCharacter
    CaractereDígitoDecimal
    Personagem de conexão
    CombinandoPersonagem
    FormataçãoCharacter

  IdentificadorContinueCharacters:
    IdentificadorContinueCharacterIdentificadorContinueCharactersopt

  LetterCharacter:
    qualquer caractere Unicode da classe Letra maiúscula (Lu) ou Letra minúscula (Ll)
    qualquer caractere Unicode da classe Letra inicial (Lt)
    qualquer caractere Unicode da classe Letra modificadora (Lm) ou Outras letras (Lo)
    qualquer caractere Unicode da classe Letra número (Nl)

  CombinandoCharacter:
    qualquer caractere Unicode da classe Marca sem espaçamento (Mn) ou Marca de combinação de espaçamento (Mc)

  CaractereDígitoDecimal:
    qualquer caractere Unicode da classe Dígito decimal (Nd)

  ConnectingCharacter:
    qualquer caractere Unicode da classe Pontuação do conector (Pc)

  FormattingCharacter:
    qualquer caractere Unicode da classe Formato (Cf)

Identificadores entre aspas simples

Um identificador entre aspas simples pode conter qualquer sequência de caracteres Unicode a ser usada como um identificador, incluindo palavras-chave, espaço em branco, comentários e operadores. Os caracteres de aspas simples têm suporte com uma sequência de escape de duas aspas simples.

  SingleQuotedIdentifier:
    Caracteres identificadores com aspas simples

  SingleQuotedIdentifierCharacters:
    SingleQuotedIdentifierCharacterCaracteres SingleQuotedIdentifieropt

  Caractere Identificador de Aspas Simples:
    Caracteres de texto Sem citação única
    SingleQuoteEscapeSequence

  CaracteresDeTextoSemAspasÚnicas:
    qualquer caractere Unicode, exceto ' (U+0027)

  SingleQuoteEscapeSequence:
    ''

Identificador não ambíguo

  Identificador Desambiguado:
    Identificador de coluna de tabela
    Identificador Global

  Identificador de coluna de tabela:
    Identificador[@Identificador]

  Identificador Global:
    [@Identificador]

Palavras-chave de contexto

  ContextoPalavra-chave:
    Parent
    Self
    ThisItem
    ThisRecord

Diferenciação entre maiúsculas de minúsculas

Os identificadores do Power Apps diferenciam caixa alta de baixa. A ferramenta de criação irá alterá-los automaticamente para as maiúsculas/minúsculas corretas quando uma fórmula estiver sendo gravada.

Separadores

  SeparadorDecimal:
    . (ponto) para idiomas que usam um ponto como separador para números decimais, por exemplo 1.23
    , (vírgula) para idiomas que usam vírgula como separador de números decimais, por exemplo 1,23

  Separador de lista:
    , (vírgula) se DecimalSeparator for . (ponto)
    ; (ponto e vírgula) se DecimalSeparator for , (vírgula)

  Separador de Encadeamento:
    ; (ponto e vírgula) se DecimalSeparator for . (ponto)
    ;; (ponto e vírgula duplo) se DecimalSeparator for , (vírgula)

Operadores

Os operadores são usados em fórmulas para descrever as operações que envolvem um ou mais operandos. Por exemplo, a expressão a + b usa o operador + para adicionar os dois operandos a e b.

  operador:
    Operador Binário
    OperadorBinárioRequerEspaçoEmBranco
    PrefixoOperador
    PrefixOperatorRequerEspaçoEmBranco
    Operador Postfix

  BinaryOperator:um dos
    =<<=>>=<>
    +-*/^
    &
    &&||
    inexactin

  BinaryOperatorRequiresWhitespace:
    AndEspaço em branco
    OrEspaço em branco

  PrefixoOperador:
    !

  PrefixOperatorRequiresWhitespace:
    NotEspaço em branco

  Operador Postfix:
    %

Operador de referência

  ReferenceOperator:um dos
    .!

Referência de objeto

  Referência:
    Referência de Base
    BaseReferenceReferenceOperatorReferenceList

  Referência Base:
    Identificador
    Identificador Desambiguado
    ContextoPalavra-chave

  Lista de referência:
    Identificador
    IdentificadorOperador de ReferênciaLista de Referência

Registro em linha

  Registro em linha:
    {Lista de Registros em Linhaopt}

  Lista de registros em linha:
    Identificador:Expressão
    Identificador:ExpressãoListSeparatorInlineRecordList

Tabela em linha

  Tabela embutida:
    [Lista de tabelas em linhaopt]

  Lista de tabelas em linha:
    Expressão
    ExpressãoListSeparatorInlineTableList

Expression

  Expressão:
    Literal
    Referência
    Registro em linha
    Tabela em linha
    Chamada de função
    (Expressão)
    Expressão PrefixOperator...
    ExpressãoPostfixOperator
    ExpressãoBinaryOperatorExpressão

Expressões encadeadas

  Expressão Encadeada:
    Expressão
    ExpressãoChainingSeparatorChainedExpressionopt

Chamada de função

  Chamada de função:
    FunctionIdentifier(Argumentos da funçãoopt)

  Identificador de função:
    Identificador
    Identificador.FunçãoIdentificador

  Argumentos de função:
    Expressão Encadeada
    ChainedExpressionListSeparatorFunctionArguments