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:
     [@ Identificador]

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

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:
     DelimitadoComentário
     SingleLineComment

   SingleLineComment:
     // SingleLineCommentCharactersoptam

   SingleLineCommentCharacters:
     SingleLineCommentCharacter
     SingleLineCommentCharacterSingleLineCommentCharactersopt

   SingleLineCommentCharacter:
    quaisquer carateres Unicode, exceto um NewLineCharacter

   DelimitadoComentário:
     /* DelimitedCommentCharactersopt*/

   DelimitedCommentCharacters:
     DelimitedCommentCharactersNoAsteriskDelimitedCommentCharactersopt
     * DelimitadoComentárioApósAsteriscoPersonagens

   DelimitadoComentárioApósAsteriscoCaracteres:
     DelimitadoComentárioNoSlashAsteriskCaractereDelimitadoComentárioPersonagensopt
     * DelimitadoComentárioApósAsteriscoPersonagens

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

   DelimitadoComentárioNoSlashAsteriskCharacter:
    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:
     LógicoLiteral
     NúmeroLiteral
     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
    truefalse

Literais numéricos

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

   NúmeroLiteral:
     DecimalDigitsExponentPartopt
     DecimalDigitsDecimalSeparator DecimalDigits...optExponentPartopt
     DecimalSeparator DecimalDigits...ExponentPartopt

   Dígitos decimais:
     DecimalDigit
     DecimalDigitsDecimalDigit

   DecimalDigit:um dos
    0123456789

   ExponentPart:
     ExponentIndicatorSignoptDecimalDigits

   ExponentIndicator:um dos
    eE

   Sinal: um dos
    +-

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.

   Identificador:
     IdentifierName,masnãoOperatorouContextKeyword

   IdentifierName:
     IdentifierStartCharacterIdentifierContinueCharactersopt
     ' SingleQuotedIdentifier'

   IdentifierStartCharacter:
     LetraCaractere
    _

   IdentifierContinueCharacter:
     IdentifierStartCharacter
     DecimalDigitCharacter
     ConnectingCharacter
     CombiningCharacter
     FormattingCharacter

   IdentifierContinueCharacters:
     IdentifierContinueCharacterIdentifierContinueCharactersopt

   LetraCaractere:
    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)

   CombinandoPersonagem:
    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:
     TextoCaracteresNãoSingleQuote
     SingleQuoteEscapeSequence

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

   SingleQuoteEscapeSequence:
    ''

Identificador desambiguado

   DisambiguatedIdentifier:
     TableColumnIdentifier
     GlobalIdentifier

   TableColumnIdentifier:
     Identificador[@Identificador]

   GlobalIdentifier:
     [@ Identificador]

Palavras-chave de contexto

   ContextoPalavra-chave:
    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

   Separador decimal:
     . (ponto) para idiomas que usam um ponto como separador para números decimais, por exemplo 1.23
     , (vírgula) para línguas que utilizam uma vírgula como separador para números decimais, por exemplo 1,23

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

   EncadeamentoSeparador:
     ; (ponto-e-vírgula) se DecimalSeparator 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.

   Operador:
     BinaryOperator
     BinaryOperatorRequiresWhitespace
     PrefixOperator
     PrefixOperatorRequiresWhitespace
     PostfixOperator

   BinaryOperator:um dos
    =<<=>>=<>
    +-*/^
    &
    &&||
    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:um dos
    .!

Referência do objeto

   Referência:
     BaseReference
     BaseReferenceReferenceOperatorReferenceList

   BaseReference:
     Identificador
     DisambiguatedIdentifier
     ContextKeyword

   Lista de referências:
     Identificador
     IdentificadorReferenceOperatorReferenceList

Registo inline

   InlineRecord:
     { InlineRecordListoptar por}

   InlineRecordList:
     Expressão do identificador:...
     Expressão de identificador:...ListSeparatorInlineRecordList

Tabela inline

   InlineTable:
     [ InlineTableListoptar por]

   InlineTableList:
     Expressão
     ExpressãoListSeparatorInlineTableList

Expression

   Expressão:
     Literal
     Referência
     InlineRecord
     InlineTable
     Chamada de função
     ( Expressão)
     Expressão PrefixOperator...
     ExpressãoPostfixOperator
     Expressão BinaryOperator......

Expressões encadeadas

   Expressão encadeada:
     Expressão
     Encadeamento de ExpressãoSeparador...ChainedExpressionopt

Chamada de função

   FunctionCall:
     FunctionIdentifier(FunctionArgumentsopt)

   FunctionIdentifier:
     Identificador
     Identificador.FunctionIdentifier

   FunctionArguments:
     Expressão encadeada
     ChainedExpressionListSeparatorFunctionArguments