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
0
1
2
3
4
5
6
7
8
9
é 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
true
false
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
0
1
2
3
4
5
6
7
8
9
ExponentPart:
ExponentIndicatorSignoptDecimalDigits
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
=
<
<=
>
>=
<>
+
-
*
/
^
&
&&
||
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 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