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:
    AndEspaço em branco
    OrEspaço em branco

  PrefixOperator:
    !

  PrefixOperatorRequiresWhitespace:
    NotEspaç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