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:

   GlobalIdentifier:
     [@ 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:

   FunctionCall:
     FunctionIdentifier(FunctionArgumentsopt)

é uma versão abreviada de:

   FunctionCall:
     FunctionIdentifier()
     FunctionIdentifier(FunctionArguments)

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:one of
    0123456789

é uma versão abreviada de:

   DecimalDigit:
    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.

   ExpressionUnit:
     ExpressionElementsopt

   ExpressionElements:
     ExpressionElement
     ExpressionElementExpressionElementsopt

   ExpressionElement:
     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:
     DelimitedComment
     SingleLineComment

   SingleLineComment:
     // SingleLineCommentCharactersopt

   SingleLineCommentCharacters:
     SingleLineCommentCharacter
     SingleLineCommentCharacterSingleLineCommentCharactersopt

   SingleLineCommentCharacter:
    qualquer caractere Unicode, exceto um NewLineCharacter

   DelimitedComment:
     /* DelimitedCommentCharactersopt*/

   DelimitedCommentCharacters:
     DelimitedCommentCharactersNoAsteriskDelimitedCommentCharactersopt
     * DelimitedCommentAfterAsteriskCharacters

   DelimitedCommentAfterAsteriskCharacters:
     DelimitedCommentNoSlashAsteriskCharacterDelimitedCommentCharactersopt
     * DelimitedCommentAfterAsteriskCharacters

   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.

   Literal:
     LogicalLiteral
     NumberLiteral
     TextLiteral

Literais lógicos

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

   LogicalLiteral:one of
    truefalse

Literais numéricos

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

   NumberLiteral:
     DecimalDigitsExponentPartopt
     DecimalDigitsDecimalSeparatorDecimalDigitsoptExponentPartopt
     DecimalSeparatorDecimalDigitsExponentPartopt

   DecimalDigits:
     DecimalDigit
     DecimalDigitsDecimalDigit

   DecimalDigit:one of
    0123456789

   ExponentPart:
     ExponentIndicatorSignoptDecimalDigits

   ExponentIndicator:one of
    eE

   Sign:one of
    +-

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

   TextLiteral:
     " TextLiteralCharactersopt"

   TextLiteralCharacters:
     TextLiteralCharacterTextLiteralCharactersopt

   TextLiteralCharacter:
     TextCharacterNoDoubleQuote
     DoubleQuoteEscapeSequence

   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.

   Identifier:
     IdentifierNamebutnotOperatororContextKeyword

   IdentifierName:
     IdentifierStartCharacterIdentifierContinueCharactersopt
     ' SingleQuotedIdentifier'

   IdentifierStartCharacter:
     LetterCharacter
    _

   IdentifierContinueCharacter:
     IdentifierStartCharacter
     DecimalDigitCharacter
     ConnectingCharacter
     CombiningCharacter
     FormattingCharacter

   IdentifierContinueCharacters:
     IdentifierContinueCharacterIdentifierContinueCharactersopt

   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)

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

   DecimalDigitCharacter:
    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:
     SingleQuotedIdentifierCharacters

   SingleQuotedIdentifierCharacters:
     SingleQuotedIdentifierCharacterSingleQuotedIdentifierCharactersopt

   SingleQuotedIdentifierCharacter:
     TextCharactersNoSingleQuote
     SingleQuoteEscapeSequence

   TextCharactersNoSingleQuote:
    qualquer caractere Unicode, exceto ' (U+0027)

   SingleQuoteEscapeSequence:
    ''

Identificador não ambíguo

   DisambiguatedIdentifier:
     TableColumnIdentifier
     GlobalIdentifier

   TableColumnIdentifier:
     Identifier[@Identifier]

   GlobalIdentifier:
     [@ Identifier]

Palavras-chave de contexto

   ContextKeyword:
    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

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

   ListSeparator:
     , (vírgula) se DecimalSeparator for . (ponto)
     ; (ponto e vírgula) se DecimalSeparator for , (vírgula)

   ChainingSeparator:
     ; (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.

   Operator:
     BinaryOperator
     BinaryOperatorRequiresWhitespace
     PrefixOperator
     PrefixOperatorRequiresWhitespace
     PostfixOperator

   BinaryOperator:one of
    =<<=>>=<>
    +-*/^
    &
    &&||
    inexactin

   BinaryOperatorRequiresWhitespace:
     And Espaço em branco
     Or Espaço em branco

   PrefixOperator:
    !

   PrefixOperatorRequiresWhitespace:
     Not Espaço em branco

   PostfixOperator:
    %

Operador de referência

   ReferenceOperator:one of
    .!

Referência de objeto

   Referência:
     BaseReference
     BaseReferenceReferenceOperatorReferenceList

   BaseReference:
     Identificador
     DisambiguatedIdentifier
     ContextKeyword

   ReferenceList:
     Identificador
     IdentifierReferenceOperatorReferenceList

Registro em linha

   InlineRecord:
     { InlineRecordListopt}

   InlineRecordList:
     Identifier:Expression
     Identifier:ExpressionListSeparatorInlineRecordList

Tabela em linha

   InlineTable:
     [ InlineTableListopt]

   InlineTableList:
     Expressão
     ExpressionListSeparatorInlineTableList

Expression

   Expressão:
     Literal
     Referência
     InlineRecord
     InlineTable
     FunctionCall
     ( Expressão)
     PrefixOperatorExpression
     ExpressionPostfixOperator
     ExpressionBinaryOperatorExpression

Expressões encadeadas

   ChainedExpression:
     Expressão
     ExpressionChainingSeparatorChainedExpressionopt

Chamada de função

   FunctionCall:
     FunctionIdentifier(FunctionArgumentsopt)

   FunctionIdentifier:
     Identificador
     Identifier.FunctionIdentifier

   FunctionArguments:
     ChainedExpression
     ChainedExpressionListSeparatorFunctionArguments