Partilhar via


Gramática de expressão

Nota

Microsoft Power Fx é o novo nome para a linguagem de fórmulas para aplicações de tela. Estes artigos associados são um trabalho em curso à medida que extraímos o idioma das aplicações de tela, o integramos com outros produtos do Microsoft Power Platform e o disponibilizamos como open source. Comece com a Descrição geral de Microsoft Power Fx para uma introdução ao idioma.

O Microsoft Power Fx baseia-se em fórmulas que ligam um nome a uma expressão. Tal como nas folhas de cálculo do Excel, à medida que as dependências de entrada para a mudança de expressão mudam, a expressão é recalculada e o valor do nome muda, podendo eventualmente fazer o recálculo em cascata noutras fórmulas.

Esta gramática cobre a parte da expressão da fórmula. A ligação a um nome para criar uma fórmula depende da forma como o Power Fx é integrado. Nas folhas de cálculo, a sintaxe de enlace não é exposta, está implícita pela localização onde a expressão é escrita, por exemplo, inserindo =B1 na célula A1. Em alguns casos, não é necessário qualquer enlace e o Power Fx é utilizado como avaliador de expressões, por exemplo, no suporte de colunas calculadas de uma tabela de bases de dados. Para as Power Apps, o enlace está implícito quando se trabalha no Power Apps Studio com um formato de serialização baseado no YAML para utilização fora do Power Apps Studio.

Convenções gramaticais

As gramáticas lexicais e sintáticas são apresentadas através de produções gramaticais. Cada produção gramatical 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 não terminais ou terminais. Nas produções gramaticais, os símbolos não terminais são apresentados em itálico e os símbolos terminais são apresentados num tipo de letra de largura fixa.

A primeira linha de uma produção gramatical diz respeito ao nome do símbolo não terminal que está a ser definido, seguido de dois pontos. Cada linha avançada sucessiva contém uma possível expansão do não terminal dada como uma sequência de símbolos não terminais ou terminais. Por exemplo, a produção:

   GlobalIdentifier:
     [@ Identifier]

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

Quando existe mais do que uma possível expansão de um símbolo não terminal, as alternativas são apresentadas em linhas separadas. Um subscrito "opt" é utilizado para indicar um símbolo opcional. Por exemplo, a produção:

   FunctionCall:
     FunctionIdentifier(FunctionArgumentsopt)

é a forma abreviada de:

   FunctionCall:
     FunctionIdentifier()
     FunctionIdentifier(FunctionArguments)

As alternativas são normalmente apresentadas em linhas separadas, embora nos casos em que existam muitas alternativas, a frase "um dos seguintes:" possa preceder uma lista de expansões dadas numa única linha. Isto é simplesmente a abreviatura para apresentar cada uma das alternativas em linhas separadas.

Por exemplo, a produção:

   DecimalDigit:um dos seguintes
    0123456789

é a forma abreviada de:

   DecimalDigit:
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9

Análise lexical

A produção de unidade lexical define a gramática lexical para uma expressão do Power Fx. Todas as expressões válidas do Power Fx estão em conformidade com esta gramática.

   ExpressionUnit:
     ExpressionElementsopt

   ExpressionElements:
     ExpressionElement
     ExpressionElementExpressionElementsopt

   ExpressionElement:
     Whitespace
     Comment

A nível lexical, uma expressão do Power Fx consiste num fluxo de elementos de Espaço em branco, Comentário e Token. Cada uma destas produções é abordada nas seguintes secções. Apenas elementos Token são significativos na gramática sintática.

Espaço em branco

O espaço em branco é utilizado para separar comentários e tokens dentro de um documento Power Apps.

   Espaço em branco:
    qualquer separador de Espaço Unicode (classe Zs)
    qualquer separador de Linha (classe Zl)
    qualquer separador de Parágrafo Unicode (classe Zp)
    Caráter de tabulação horizontal (U+0009)
    Caráter de avanço de linha (U+000A)
    Caráter de tabulação vertical (U+000B)
    Caráter de feed de formulário (U+000C)
    Caráter de símbolo de retorno (U+000D)
    Caráter de linha seguinte (U+0085)

Comentários

São suportadas duas formas de comentários:

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

   Comentário:
     DelimitedComment
     SingleLineComment

   SingleLineComment:
     // SingleLineCommentCharactersopt

   SingleLineCommentCharacters:
     SingleLineCommentCharacter
     SingleLineCommentCharacterSingleLineCommentCharactersopt

   SingleLineCommentCharacter:
    quaisquer carateres Unicode, exceto um NewLineCharacter

   DelimitedComment:
     /* DelimitedCommentCharactersopt*/

   DelimitedCommentCharacters:
     DelimitedCommentCharactersNoAsteriskDelimitedCommentCharactersopt
     * DelimitedCommentAfterAsteriskCharacters

   DelimitedCommentAfterAsteriskCharacters:
     DelimitedCommentNoSlashAsteriskCharacterDelimitedCommentCharactersopt
     * DelimitedCommentAfterAsteriskCharacters

   DelimitedCommentCharactersNoAsterisk:
    qualquer caráter Unicode, exceto * (asterisco)

   DelimitedCommentNoSlashAsteriskCharacter:
    qualquer caráter Unicode, exceto uma / (barra) ou * (asterisco)

Os comentários não são agrupados. As sequências de carateres /* e */ não têm um significado especial dentro de um comentário de linha única e as sequências de carateres // e /* não têm um significado especial dentro de um comentário delimitado.

Os comentários não são processados em séries 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 seguintes exemplos incluem três comentários de linha única:

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

Literais

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

   Literal:
     LogicalLiteral
     NumberLiteral
     TextLiteral

Literais lógicos

Um literal lógico é utilizado para escrever os valores verdadeiro e falso, e produzir um valor lógico.

   LogicalLiteral:um dos seguintes
    truefalse

Literais numéricos

Um literal numérico é utilizado para escrever um valor numérico e produzir um valor numérico.

   NumberLiteral:
     DecimalDigitsExponentPartopt
     DecimalDigitsDecimalSeparatorDecimalDigitsoptExponentPartopt
     DecimalSeparatorDecimalDigitsExponentPartopt

   DecimalDigits:
     DecimalDigit
     DecimalDigitsDecimalDigit

   DecimalDigit:um dos seguintes
    0123456789

   ExponentPart:
     ExponentIndicatorSignoptDecimalDigits

   ExponentIndicator:um dos seguintes
    eE

   Sign:um dos seguintes
    +-

Literais de texto

Um literal de texto é utilizado para escrever uma sequência de carateres Unicode e produzir um valor de texto. Os literais de texto aparecem entre aspas duplas. Para incluir as aspas duplas no valor do texto, repita as aspas duplas, como mostra o exemplo seguinte:

"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 utilizado para se referir a um valor. Os identificadores podem ser identificadores regulares ou identificadores delimitados por plicas.

   Identifier:
     IdentifierNamemasnãoOperatorouContextKeyword

   IdentifierName:
     IdentifierStartCharacterIdentifierContinueCharactersopt
     ' SingleQuotedIdentifier'

   IdentifierStartCharacter:
     LetterCharacter
    _

   IdentifierContinueCharacter:
     IdentifierStartCharacter
     DecimalDigitCharacter
     ConnectingCharacter
     CombiningCharacter
     FormattingCharacter

   IdentifierContinueCharacters:
     IdentifierContinueCharacterIdentifierContinueCharactersopt

   LetterCharacter:
    qualquer caráter Unicode de classe Letra maiúscula (Lu) ou letra minúscula (Ll)
    qualquer caráter Unicode da classe Letra de título (Lt)
    qualquer caráter Unicode de classe Modificador de letra (Lm) ou Outra letra (Lo)
    qualquer caráter Unicode da classe Letra número (Nl)

   CombiningCharacter:
    qualquer caráter Unicode da classe Marca de não espaçamento (Mn) ou Marca de combinação de espaçamento (Mc)

   DecimalDigitCharacter:
    qualquer caráter Unicode da classe Dígito decimal (Nd)

   ConnectingCharacter:
    qualquer caráter Unicode da classe Pontuação do conector (Pc) (Pc)

   FormattingCharacter:
    qualquer caráter Unicode da classe Formato (Cf)

Identificadores entre plicas

Um único identificador citado pode conter qualquer sequência de carateres Unicode para ser utilizada como identificador, incluindo palavras-chave, espaços em branco, comentários e operadores. Os carateres de marca de aspa única são suportados com uma sequência de duas aspas únicas.

   SingleQuotedIdentifier:
     SingleQuotedIdentifierCharacters

   SingleQuotedIdentifierCharacters:
     SingleQuotedIdentifierCharacterSingleQuotedIdentifierCharactersopt

   SingleQuotedIdentifierCharacter:
     TextCharactersNoSingleQuote
     SingleQuoteEscapeSequence

   TextCharactersNoSingleQuote:
    qualquer caráter Unicode, exceto ' (U+0027)

   SingleQuoteEscapeSequence:
    ''

Identificador desambiguado

   DisambiguatedIdentifier:
     TableColumnIdentifier
     GlobalIdentifier

   TableColumnIdentifier:
     Identifier[@Identifier]

   GlobalIdentifier:
     [@ Identifier]

Palavras-chave de contexto

   ContextKeyword:
    Parent
    Self
    ThisItem
    ThisRecord

Sensível às maiúsculas e minúsculas

Os identificadores do Power Apps são sensíveis às maiúsculas e minúsculas. A ferramenta de criação muda-as automaticamente para o caso correto quando uma fórmula está a ser escrita.

Separadores

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

   ListSeparator:
     , (vírgula) se DecimalSeparator for . (dot)
     ; (ponto e vírgula) se o separador decimal for , (vírgula)

   ChainingSeparator:
     ; (ponto e vírgula) se o separador decimal for . (ponto)
     ;; (ponto e vírgula duplo) se DecimalSeparator for , (vírgula)

Operadores

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

   Operator:
     BinaryOperator
     BinaryOperatorRequiresWhitespace
     PrefixOperator
     PrefixOperatorRequiresWhitespace
     PostfixOperator

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

   BinaryOperatorRequiresWhitespace:
     And Whitespace
     Or Whitespace

   PrefixOperator:
    !

   PrefixOperatorRequiresWhitespace:
     Not Whitespace

   PostfixOperator:
    %

Operador de referência

   ReferenceOperator:um dos seguintes
    .!

Referência do objeto

   Reference:
     BaseReference
     BaseReferenceReferenceOperatorReferenceList

   BaseReference:
     Identifier
     DisambiguatedIdentifier
     ContextKeyword

   ReferenceList:
     Identifier
     IdentifierReferenceOperatorReferenceList

Registo inline

   InlineRecord:
     { InlineRecordListopt}

   InlineRecordList:
     Identifier:Expression
     Identifier:ExpressionListSeparatorInlineRecordList

Tabela inline

   InlineTable:
     [ InlineTableListopt]

   InlineTableList:
     Expression
     ExpressionListSeparatorInlineTableList

Expression

   Expression:
     Literal
     Reference
     InlineRecord
     InlineTable
     FunctionCall
     ( Expression)
     PrefixOperatorExpression
     ExpressionPostfixOperator
     ExpressionBinaryOperatorExpression

Expressões encadeadas

   ChainedExpression:
     Expression
     ExpressionChainingSeparatorChainedExpressionopt

Chamada de função

   FunctionCall:
     FunctionIdentifier(FunctionArgumentsopt)

   FunctionIdentifier:
     Identifier
     Identifier.FunctionIdentifier

   FunctionArguments:
     ChainedExpression
     ChainedExpressionListSeparatorFunctionArguments