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

  PrefixOperator:
    !

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