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
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:
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
true
false
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
0
1
2
3
4
5
6
7
8
9
ExponentPart:
ExponentIndicatorSignoptDecimalDigits
ExponentIndicator:um dos seguintes
e
E
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
=
<
<=
>
>=
<>
+
-
*
/
^
&
&&
||
in
exactin
BinaryOperatorRequiresWhitespace:
And
Whitespace
Or
Whitespace
PrefixOperatorRequiresWhitespace:
Not
Whitespace
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
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários