Compartilhar via


Gramática de expressão

Nota

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:
     SingleLineCommentCharacter
     SingleLineCommentCharacterCaracteres de comentário de linha únicaopt

   SingleLineCommentCharacter:
    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
     DecimalSeparatorDecimalDigitsExponentPartopt

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

   DecimalDigit:um dos
    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
     ' SingleQuotedIdentifier'

   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:
     And Espaço em branco
     Or Espaço em branco

   PrefixoOperador:
    !

   PrefixOperatorRequiresWhitespace:
     Not Espaç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:
     Identificador de Função(Argumentos de Funçãoopt)

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

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