Gramática de expressão
Observação
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:
Identificador Global:
[@
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:
Chamada de função:
FunctionIdentifier(
Argumentos da funçãoopt)
é uma versão abreviada de:
Chamada de função:
Identificador de Função(
)
FunctionIdentifier(
Argumentos da função)
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:um dos
0
1
2
3
4
5
6
7
8
9
é uma versão abreviada de:
DígitoDecimal:
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.
Unidade de expressão:
Elementos de Expressãoopt
Elementos de expressão:
ExpressãoElemento
Elemento de expressãoElementos de expressãoopt
Elemento de expressão:
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:
Comentário Delimitado
Comentário de linha única
Comentário de linha única:
//
SingleLineCommentCharactersopt
SingleLineCommentCharacters:
CaractereCommentLinhaSingle
SingleLineCommentCharacterCaracteres de comentário de linha únicaopt
CaractereCommentLinhaSingle:
qualquer caractere Unicode, exceto um NewLineCharacter
ComentárioDelimitado:
/*
DelimitedCommentCharactersopt*/
DelimitedCommentCharacters:
CaracteresDelimitadosCommentSemAsteriscoCaracteresDelimitadosCommentopt
*
DelimitedCommentAfterAsteriscoCaracteres
DelimitedCommentAfterAsteriskCharacters:
DelimitedCommentNoSlashAsteriskCharacterDelimitedCommentCharactersopt
*
DelimitedCommentAfterAsteriscoCaracteres
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.
Literalmente:
LógicoLiteral
NúmeroLiteral
TextoLiteral
Literais lógicos
Um literal lógico é usado para gravar os valores verdadeiro e falso e produz um valor lógico.
LogicalLiteral:um dos
true
false
Literais numéricos
Um literal de número é usado para escrever um valor numérico e produz um valor de número.
NúmeroLiteral:
DígitosDecimaisParteExponenteopt
DígitosDecimaisSeparadorDecimalDígitosDecimaisoptParteExponenteopt
SeparadorDecimalDígitosDecimaisParteExponenteopt
Dígitos decimais:
Dígito decimal
DígitosDecimaisDígitosDecimais
DecimalDigit:um de
0
1
2
3
4
5
6
7
8
9
ParteExponente:
ExponentIndicatorSinaloptDígitos Decimais
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
TextoLiteral:
"
TextoCaracteresLiteraisopt"
CaracteresLiteraisDeTexto:
CaractereLiteralTextoCaracteresLiteraisTextooptar
CaractereLiteralTexto:
CaractereTextoSemAspasDuplas
Sequência de escape de aspas duplas
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.
Identificador:
IdentifierNamemasnãooperadorouContextKeyword
Nome do Identificador:
IdentificadorStartCharacterIdentificadorContinueCharactersopt
'
Identificador de Aspas Simples'
IdentificadorStartCharacter:
LetraPersonagem
_
IdentificadorContinueCharacter:
IdentificadorStartCharacter
CaractereDígitoDecimal
Personagem de conexão
CombinandoPersonagem
FormataçãoCharacter
IdentificadorContinueCharacters:
IdentificadorContinueCharacterIdentificadorContinueCharactersopt
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)
CombinandoCharacter:
qualquer caractere Unicode da classe Marca sem espaçamento (Mn) ou Marca de combinação de espaçamento (Mc)
CaractereDígitoDecimal:
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:
Caracteres identificadores com aspas simples
SingleQuotedIdentifierCharacters:
SingleQuotedIdentifierCharacterCaracteres SingleQuotedIdentifieropt
Caractere Identificador de Aspas Simples:
Caracteres de texto Sem citação única
SingleQuoteEscapeSequence
CaracteresDeTextoSemAspasÚnicas:
qualquer caractere Unicode, exceto ' (U+0027)
SingleQuoteEscapeSequence:
'
'
Identificador não ambíguo
Identificador Desambiguado:
Identificador de coluna de tabela
Identificador Global
Identificador de coluna de tabela:
Identificador[@
Identificador]
Identificador Global:
[@
Identificador]
Palavras-chave de contexto
ContextoPalavra-chave:
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
SeparadorDecimal:
.
(ponto) para idiomas que usam um ponto como separador para números decimais, por exemplo 1.23
,
(vírgula) para idiomas que usam vírgula como separador de números decimais, por exemplo 1,23
Separador de lista:
,
(vírgula) se DecimalSeparator for .
(ponto)
;
(ponto e vírgula) se DecimalSeparator for ,
(vírgula)
Separador de Encadeamento:
;
(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
.
operador:
Operador Binário
OperadorBinárioRequerEspaçoEmBranco
PrefixoOperador
PrefixOperatorRequerEspaçoEmBranco
Operador Postfix
BinaryOperator:um dos
=
<
<=
>
>=
<>
+
-
*
/
^
&
&&
||
in
exactin
BinaryOperatorRequiresWhitespace:
And
Espaço em branco
Or
Espaço em branco
PrefixOperatorRequiresWhitespace:
Not
Espaço em branco
Operador de referência
Referência de objeto
Referência:
Referência de Base
BaseReferenceReferenceOperatorReferenceList
Referência Base:
Identificador
Identificador Desambiguado
ContextoPalavra-chave
Lista de referência:
Identificador
IdentificadorOperador de ReferênciaLista de Referência
Registro em linha
Registro em linha:
{
Lista de Registros em Linhaopt}
Lista de registros em linha:
Identificador:
Expressão
Identificador:
ExpressãoListSeparatorInlineRecordList
Tabela em linha
Tabela embutida:
[
Lista de tabelas em linhaopt]
Lista de tabelas em linha:
Expressão
ExpressãoListSeparatorInlineTableList
Expression
Expressão:
Literal
Referência
Registro em linha
Tabela em linha
Chamada de função
(
Expressão)
Expressão PrefixOperator...
ExpressãoPostfixOperator
ExpressãoBinaryOperatorExpressão
Expressões encadeadas
Expressão Encadeada:
Expressão
ExpressãoChainingSeparatorChainedExpressionopt
Chamada de função
Chamada de função:
FunctionIdentifier(
Argumentos da funçãoopt)
Identificador de função:
Identificador
Identificador.
FunçãoIdentificador
Argumentos de função:
Expressão Encadeada
ChainedExpressionListSeparatorFunctionArguments