Gramática de expresión
Nota
Microsoft Power Fx é o novo nome da linguaxe de fórmulas para aplicacións de lenzo. Estes artigos son un traballo en curso a medida que extraemos o idioma das aplicacións de lenzo, o integramos con outros produtos de Microsoft Power Platform e o poñemos a disposición como código aberto. Comece coa visión xeral de Microsoft Power Fx para ver unha introdución á lingaxe.
Microsoft Power Fx baséase en fórmulas que unen un nome a unha expresión. Do mesmo xeito que nas follas de traballo de Excel, a medida que as dependencias de entrada coa expresión cambian, a expresión recálculase e o valor do nome cambia, posiblemente xerando en cascada o recálculo noutras fórmulas.
Esta gramática abrangue a parte de expresión da fórmula. A vinculación a un nome para crear unha fórmula depende de como se integre Power Fx. Nas follas de traballo, a sintaxe de vinculación non está exposta, está implícita no lugar onde está escrita a expresión; por exemplo, inserindo =B1
na cela A1. Nalgúns casos, non se require ningunha vinculación e Power Fx úsase como avaliador de expresións, por exemplo, para soportar columnas calculadas dunha táboa de base de datos. Para Power Apps, a vinculación está implícita cando se traballa en Power Apps Studio cun formato de serialización baseado en YAML para usar fóra de Power Apps Studio.
Convencións gramaticais
As gramáticas léxicas e sintácticas preséntanse empregando producións gramaticais. Cada produción gramatical define un símbolo non terminal e as posibles expansións dese símbolo non terminal en secuencias de símbolos non terminais ou terminais. Nas producións gramaticais, os símbolos non terminais móstranse en cursiva e os símbolos terminais móstranse nunha fonte de ancho fixo.
A primeira liña dunha produción gramatical é o nome do símbolo non terminal que se define, seguido de dous puntos. Cada liña sucesiva de sangría contén unha posible expansión do símbolo non terminal dado como unha secuencia de símbolos non terminais ou terminais. Por exemplo, a produción:
GlobalIdentifier:
[@
Identificador]
define un GlobalIdentifier como un elemento que consta do token [@
seguido dun Identificador, seguido do token ]
.
Cando hai máis dunha posible expansión dun símbolo non terminal, as alternativas enuméranse en liñas separadas. O subíndice "opt" úsase para indicar un símbolo opcional. Por exemplo, a produción:
FunctionCall:
FunctionIdentifier(
FunctionArgumentsopt)
é a abreviatura de:
FunctionCall:
FunctionIdentifier(
)
FunctionIdentifier(
FunctionArguments)
As alternativas normalmente están listadas en liñas separadas, aínda que nos casos en que hai moitas alternativas, a frase "one of" pode preceder a unha lista de expansións dada nunha única liña. Isto é simplemente unha abreviatura para listar cada unha das alternativas en liñas separadas.
Por exemplo, a produción:
DecimalDigit:one of
0
1
2
3
4
5
6
7
8
9
é a abreviatura de:
DecimalDigit:
0
1
2
3
4
5
6
7
8
9
Análise léxica
A produción de unidades léxicas define a gramática léxica para unha expresión de Power Fx. Todas as expresións válidas de Power Fx axústanse a esta gramática.
ExpressionUnit:
ExpressionElementsopt
ExpressionElements:
ExpressionElement
ExpressionElementExpressionElementsopt
ExpressionElement:
Espazo en branco
Comentario
A nivel léxico, unha expresión de Power Fx está composta por un fluxo de elementos de Espazo en branco, Comentario e Token. Cada unha destas producións está cuberta nas seguintes seccións. Só os elementos Token son significativos na gramática sintáctica.
Espazo en branco
O espazo en branco úsase para separar comentarios e tokens dentro dun documento de Power Apps.
Espazo en branco:
calquera separador de espazo Unicode (clase Zs)
calquera separador de liña Unicode (clase Zl)
calquera separador de parágrafos Unicode (clase Zp)
Carácter de pestana horizontal (U + 0009)
Carácter de avance de liña (U + 000A)
Carácter de pestana vertical (U + 000B)
Carácter de avance de páxina (U + 000C)
Carácter de retorno de carro (U+000D)
Carácter de seguinte liña (U+0085)
Comentarios
Admítense dúas formas de comentarios:
- Comentarios dunha soa liña que comezan cos caracteres
//
e se estenden ao final da liña de orixe. - Comentarios delimitados que comezan cos caracteres
/*
e rematan cos caracteres*/
. Os comentarios delimitados poden abarcar varias liñas.
Comentario:
DelimitedComment
SingleLineComment
SingleLineComment:
//
SingleLineCommentCharactersopt
SingleLineCommentCharacters:
SingleLineCommentCharacter
SingleLineCommentCharacterSingleLineCommentCharactersopt
SingleLineCommentCharacter:
calquera carácter Unicode excepto un NewLineCharacter
DelimitedComment:
/*
DelimitedCommentCharactersopt*/
DelimitedCommentCharacters:
DelimitedCommentCharactersNoAsteriskDelimitedCommentCharactersopt
*
DelimitedCommentAfterAsteriskCharacters
DelimitedCommentAfterAsteriskCharacters:
DelimitedCommentNoSlashAsteriskCharacterDelimitedCommentCharactersopt
*
DelimitedCommentAfterAsteriskCharacters
DelimitedCommentCharactersNoAsterisk:
calquera carácter Unicode excepto * (asterisco)
DelimitedCommentNoSlashAsteriskCharacter:
calquera carácter Unicode excepto a / (barra) ou * (asterisco)
Os comentarios non están aniñados. As secuencias de caracteres /*
e */
non teñen un significado especial dentro dun comentario dunha soa liña, e as secuencias de caracteres //
e /*
non teñen un significado especial dentro dun comentario delimitado.
Os comentarios non se procesan dentro de cadeas de literais de texto.
O seguinte exemplo inclúe dous comentarios delimitados:
/* Hello, world
*/
"Hello, world" /* This is an example of a text literal */
Os seguintes exemplos inclúen tres comentarios dunha soa liña:
// Hello, world
//
"Hello, world" // This is an example of a text literal
Literais
Un literal é unha representación de código fonte dun valor.
Literal:
LogicalLiteral
NumberLiteral
TextLiteral
Literais lóxicos
Un literal lóxico úsase para escribir os valores verdadeiro e falso e producir un valor lóxico.
LogicalLiteral:one of
true
false
Literais de número
Un literal numérico úsase para escribir un valor numérico e producir un valor numérico.
NumberLiteral:
DecimalDigitsExponentPartopt
DecimalDigitsDecimalSeparatorDecimalDigitsoptExponentPartopt
DecimalSeparatorDecimalDigitsExponentPartopt
DecimalDigits:
DecimalDigit
DecimalDigitsDecimalDigit
DecimalDigit:one of
0
1
2
3
4
5
6
7
8
9
ExponentPart:
ExponentIndicatorSignoptDecimalDigits
Literais de texto
Un literal de texto úsase para escribir unha secuencia de caracteres Unicode e producir un valor de texto. Os literais de texto están encerrados entre comiñas dobres. Para incluír comiñas dobres no valor do texto, repita as comiñas dobres, como se mostra no seguinte exemplo:
"The ""quoted"" text" // The "quoted" text
TextLiteral:
"
TextLiteralCharactersopt"
TextLiteralCharacters:
TextLiteralCharacterTextLiteralCharactersopt
TextLiteralCharacter:
TextCharacterNoDoubleQuote
DoubleQuoteEscapeSequence
TextCharacterNoDoubleQuote:
calquera punto de código Unicode excepto as comiñas dobres
DoubleQuoteEscapeSequence:
"
"
Identificadores
Un identificador é un nome usado para facer referencia a un valor. Os identificadores poden ser identificadores regulares ou identificadores entre comiñas simples.
Identifier:
IdentifierNamebutnotOperatororContextKeyword
IdentifierName:
IdentifierStartCharacterIdentifierContinueCharactersopt
'
SingleQuotedIdentifier'
IdentifierStartCharacter:
LetterCharacter
_
IdentifierContinueCharacter:
IdentifierStartCharacter
DecimalDigitCharacter
ConnectingCharacter
CombiningCharacter
FormattingCharacter
IdentifierContinueCharacters:
IdentifierContinueCharacterIdentifierContinueCharactersopt
LetterCharacter:
calquera carácter Unicode da clase Letra maiúscula (Lu) ou Letra minúscula (Ll)
calquera carácter Unicode da clase letra maiúscula (Lt)
calquera carácter Unicode da clase modificador de letra (Lm) ou Outra letra (Lo)
calquera carácter Unicode da clase letra número (Nl)
CombiningCharacter:
calquera carácter Unicode da clase Marca sen espazamento (Mn) ou Espazamento combinando marca (Mc)
DecimalDigitCharacter:
calquera carácter Unicode da clase díxito decimal (Nd)
ConnectingCharacter:
calquera carácter Unicode da clase Puntuación de conector (Pc)
FormattingCharacter:
calquera carácter Unicode da clase Formato (Cf)
Identificadores cunha comiña
Un identificador único entre comiñas pode conter calquera secuencia de caracteres Unicode que se usará como identificador, incluíndo palabras clave, espazos en branco, comentarios e operadores. Os caracteres de comiñas simples admítense cunha secuencia de escape de dúas comiñas simples.
SingleQuotedIdentifier:
SingleQuotedIdentifierCharacters
SingleQuotedIdentifierCharacters:
SingleQuotedIdentifierCharacterSingleQuotedIdentifierCharactersopt
SingleQuotedIdentifierCharacter:
TextCharactersNoSingleQuote
SingleQuoteEscapeSequence
TextCharactersNoSingleQuote:
calquera carácter Unicode excepto ' (U+0027)
SingleQuoteEscapeSequence:
'
'
Identificador sen ambigüidade
DisambiguatedIdentifier:
TableColumnIdentifier
GlobalIdentifier
TableColumnIdentifier:
Identifier[@
Identifier]
GlobalIdentifier:
[@
Identifier]
Palabras clave de contexto
ContextKeyword:
Parent
Self
ThisItem
ThisRecord
Diferenciación entre maiúsculas e minúsculas
Os identificadores de Power Apps distinguen entre maiúsculas e minúsculas. A ferramenta de creación cambiaráos automaticamente á letra correcta cando se estea escribindo unha fórmula.
Separadores
DecimalSeparator:
.
(punto) para as linguas que usan un punto como separador de números decimais, por exemplo 1.23
,
(coma) para a linguaxes que usan unha coma como separador de números decimais, por exemplo 1,23
ListSeparator:
,
(coma) se DecimalSeparator é .
(punto)
;
(punto e coma) se DecimalSeparator é ,
(coma)
ChainingSeparator:
;
(punto e coma) se DecimalSeparator é .
(punto)
;;
(punto e coma dobre) se DecimalSeparator é ,
(coma)
Operadores
Os operadores úsanse en fórmulas para describir operacións que inclúen un ou máis operandos. Por exemplo, a expresión a + b
usa o operador +
para engadir os dous operandos a
e b
.
Operador:
BinaryOperator
BinaryOperatorRequiresWhitespace
PrefixOperator
PrefixOperatorRequiresWhitespace
PostfixOperator
BinaryOperator:one of
=
<
<=
>
>=
<>
+
-
*
/
^
&
&&
||
in
exactin
BinaryOperatorRequiresWhitespace:
And
Espazo en branco
Or
Espazo en branco
PrefixOperatorRequiresWhitespace:
Not
Espazo en branco
Operador de referencia
Referencia do obxecto
Referencia:
BaseReference
BaseReferenceReferenceOperatorReferenceList
BaseReference:
Identificador
DisambiguatedIdentifier
ContextKeyword
ReferenceList:
Identificador
IdentifierReferenceOperatorReferenceList
Rexistro en liña
InlineRecord:
{
InlineRecordListopt}
InlineRecordList:
Identifier:
Expression
Identifier:
ExpressionListSeparatorInlineRecordList
Táboa en liña
InlineTable:
[
InlineTableListopt]
InlineTableList:
Expresión
ExpressionListSeparatorInlineTableList
Expression
Expresión:
Literal
Referencia
InlineRecord
InlineTable
FunctionCall
(
Expresión)
PrefixOperatorExpresión
ExpresiónPostfixOperator
ExpresiónBinaryOperatorExpresión
Expresións encadeadas
ChainedExpression:
Expresión
ExpresiónChainingSeparatorChainedExpressionopt
Chamada de función
FunctionCall:
FunctionIdentifier(
FunctionArgumentsopt)
FunctionIdentifier:
Identificador
Identifier.
FunctionIdentifier
FunctionArguments:
ChainedExpression
ChainedExpressionListSeparatorFunctionArguments