Gramática de expresión
Nota
Microsoft Power Fx es el nuevo nombre del lenguaje de fórmulas para aplicaciones de lienzo. Estos artículos son un trabajo en progreso a medida que extraemos el idioma de las aplicaciones de lienzo, lo integramos con otros productos Microsoft Power Platform y ponerlo a disposición como código abierto. Empiece con Información general de Microsoft Power Fx para una introducción al idioma.
Microsoft Power Fx se basa en fórmulas que unen un nombre a una expresión. Al igual que en las hojas de cálculo de Excel, a medida que cambian las dependencias entrantes de la expresión, la expresión se vuelve a calcular y el valor del nombre cambia, posiblemente haciendo que el recálculo se vuelva en cascada a otras fórmulas.
Esta gramática cubre la parte de expresión de la fórmula. La vinculación a un nombre para crear una fórmula depende de cómo se integre Power Fx. En las hojas de trabajo, la sintaxis de enlace no está expuesta, está implícita en la ubicación donde se escribe la expresión, por ejemplo, ingresando =B1
en la celda A1. En algunos casos, no se requiere ningún enlace y Power Fx se utiliza como evaluador de expresiones, por ejemplo, para admitir columnas calculadas de una tabla de base de datos. Para Power Apps, el enlace está implícito cuando se trabaja en Power Apps Studio con un formato de serialización basado en YAML para usar fuera de Power Apps Studio.
Convenciones gramaticales
Las gramáticas léxicas y sintácticas se presentan mediante producciones gramaticales. En cada producción gramatical se define un símbolo que no es de terminal y las posibles expansiones de ese símbolo en secuencias de símbolos terminales o no terminales. En las producciones gramaticales, los símbolos no terminales se muestran en cursiva y los símbolos terminales se muestran en una fuente de ancho fijo.
La primera línea de una producción gramatical es el nombre del símbolo que no es de terminal que se define, seguido de un signo de dos puntos. Cada línea con sangría sucesiva contiene una posible expansión del símbolo de no terminal proporcionada como una secuencia de símbolos terminales o no terminales. Por ejemplo, la producción:
GlobalIdentifier:
[@
Identifier]
Define un GlobalIdentifier para consistir en el token [@
, seguido de un Identificador, seguido del token ]
.
Cuando hay más de una expansión posible de un símbolo que no es de terminal, las alternativas se enumeran en líneas independientes. Se usa el sufijo de subíndice "opt" para indicar un símbolo opcional. Por ejemplo, la producción:
FunctionCall:
FunctionIdentifier(
FunctionArgumentsopt)
es la abreviatura de:
FunctionCall:
FunctionIdentifier(
)
FunctionIdentifier(
FunctionArguments)
Las alternativas se muestran normalmente en líneas independientes, aunque en casos donde hay muchas alternativas, la frase "uno de" podría preceder a una lista de expansiones indicadas en una sola línea. Esto es simplemente una abreviatura para enumerar cada una de las alternativas en líneas independientes.
Por ejemplo, la producción:
DecimalDigit:one of
0
1
2
3
4
5
6
7
8
9
es la abreviatura de:
DecimalDigit:
0
1
2
3
4
5
6
7
8
9
Análisis léxico
La producción de unidades léxicas define la gramática léxica para una expresión de Power Fx. Cada expresión válida de Power Fx se ajusta a esta gramática.
ExpressionUnit:
ExpressionElementsopt
ExpressionElements:
ExpressionElement
ExpressionElementExpressionElementsopt
ExpressionElement:
Whitespace
Comment
En el nivel léxico, una expresión de Power Fx está formada por una secuencia de elementos Whitespace, Comment y Token. Cada una de estas producciones se explica en las secciones siguientes. Solo los elementos Token son significativos en la gramática sintáctica.
Espacio en blanco
El espacio en blanco se usa para separar los comentarios y los tokens dentro de un documento de Power Apps.
Whitespace:
cualquier separador de espacio Unicode (clase Zs)
cualquier separador de línea Unicode (clase Zl)
cualquier separador de párrafo Unicode (clase Zp)
carácter de tabulación horizontal (U+0009)
carácter de avance de línea (U+000A)
carácter de tabulación vertical (U+000B)
Carácter de avance de página (U+000C)
Carácter de retorno de carro (U+000D)
Carácter de línea siguiente (U+0085)
Comentarios
Se admiten dos formas de comentarios:
- Los comentarios de una sola línea comienzan con los caracteres
//
y se extienden hasta el final de la línea de código fuente. - Los comentarios delimitados comienzan con los caracteres
/*
y terminan con los caracteres*/
. Los comentarios delimitados pueden abarcar varias líneas.
Comment:
DelimitedComment
SingleLineComment
SingleLineComment:
//
SingleLineCommentCharactersopt
SingleLineCommentCharacters:
SingleLineCommentCharacter
SingleLineCommentCharacterSingleLineCommentCharactersopt
SingleLineCommentCharacter:
cualquier carácter Unicode excepto un NewLineCharacter
DelimitedComment:
/*
DelimitedCommentCharactersopt*/
DelimitedCommentCharacters:
DelimitedCommentCharactersNoAsteriskDelimitedCommentCharactersopt
*
DelimitedCommentAfterAsteriskCharacters
DelimitedCommentAfterAsteriskCharacters:
DelimitedCommentNoSlashAsteriskCharacterDelimitedCommentCharactersopt
*
DelimitedCommentAfterAsteriskCharacters
DelimitedCommentCharactersNoAsterisk:
Cualquier carácter Unicode menos * (asterisco)
DelimitedCommentNoSlashAsteriskCharacter:
Cualquier carácter Unicode menos un / (barra) o * (asterisco)
Los comentarios no están anidados. Las secuencias de caracteres /*
y */
no tienen ningún significado especial en un comentario de una sola línea y las secuencias de caracteres //
y /*
tampoco lo tienen dentro de un comentario delimitado.
Los comentarios no se procesan dentro de las cadenas literales de texto.
El siguiente ejemplo incluye dos comentarios delimitados:
/* Hello, world
*/
"Hello, world" /* This is an example of a text literal */
Los siguientes ejemplos incluyen tres comentarios de una sola línea:
// Hello, world
//
"Hello, world" // This is an example of a text literal
Literales
Un literal es una representación de código fuente de un valor.
Literal:
LogicalLiteral
NumberLiteral
TextLiteral
Literales lógicos
Un literal lógico se usa para escribir los valores true y false, y genera un valor lógico.
LogicalLiteral:one of
true
false
Literales numéricos
Un literal numérico se usa para escribir un valor numérico y genera un valor de número.
NumberLiteral:
DecimalDigitsExponentPartopt
DecimalDigitsDecimalSeparatorDecimalDigitsoptExponentPartopt
DecimalSeparatorDecimalDigitsExponentPartopt
DecimalDigits:
DecimalDigit
DecimalDigitsDecimalDigit
DecimalDigit:one of
0
1
2
3
4
5
6
7
8
9
ExponentPart:
ExponentIndicatorSignoptDecimalDigits
Literales de texto
Un literal de texto se usa para escribir una secuencia de caracteres Unicode y genera un valor de texto. Los literales de texto se encierran entre comillas dobles. Para incluir comillas dobles en el valor del texto, repita las comillas dobles, como se muestra en el siguiente ejemplo:
"The ""quoted"" text" // The "quoted" text
TextLiteral:
"
TextLiteralCharactersopt"
TextLiteralCharacters:
TextLiteralCharacterTextLiteralCharactersopt
TextLiteralCharacter:
TextCharacterNoDoubleQuote
DoubleQuoteEscapeSequence
TextCharacterNoDoubleQuote:
cualquier punto de código Unicode excepto comillas dobles
DoubleQuoteEscapeSequence:
"
"
Identificadores
Un identificador es un nombre que se usa para hacer referencia a un valor. Los identificadores pueden ser normales o entre comillas.
Identifier:
IdentifierNameperonoOperatoroContextKeyword
IdentifierName:
IdentifierStartCharacterIdentifierContinueCharactersopt
'
SingleQuotedIdentifier'
IdentifierStartCharacter:
LetterCharacter
_
IdentifierContinueCharacter:
IdentifierStartCharacter
DecimalDigitCharacter
ConnectingCharacter
CombiningCharacter
FormattingCharacter
IdentifierContinueCharacters:
IdentifierContinueCharacterIdentifierContinueCharactersopt
LetterCharacter:
cualquier carácter Unicode de la clase Letra mayúscula (Lu) o Letra minúscula (Ll)
cualquier carácter Unicode de la clase Título letra mayúscula (Lt) (Lt)
cualquier carácter Unicode de la clase Modificador de letra (Lm) u (Lm) u Otra letra (Lo)
cualquier carácter Unicode de la clase letra Número (Nl)
CombiningCharacter:
cualquier carácter Unicode de la clase Marca sin espaciado (Mn) o Marca de combinación de espaciado (Mc)
DecimalDigitCharacter:
cualquier carácter Unicode de la clase Dígito decimal (Nd)
ConnectingCharacter:
cualquier carácter Unicode de la clase Puntuación del conector (Pc)
FormattingCharacter:
cualquier carácter Unicode de la clase Formato (Cf)
Identificadores entre comillas simples
Un identificador único entre comillas puede contener cualquier secuencia de caracteres Unicode como identificador, incluidas las palabras clave, los espacios en blanco, los comentarios y los operadores. Los caracteres de comillas simples se admiten con una secuencia de escape de dos comillas simples.
SingleQuotedIdentifier:
SingleQuotedIdentifierCharacters
SingleQuotedIdentifierCharacters:
SingleQuotedIdentifierCharacterSingleQuotedIdentifierCharactersopt
SingleQuotedIdentifierCharacter:
TextCharactersNoSingleQuote
SingleQuoteEscapeSequence
TextCharactersNoSingleQuote:
Cualquier carácter Unicode menos ' (U+0027)
SingleQuoteEscapeSequence:
'
'
Identificador desambiguado
DisambiguatedIdentifier:
TableColumnIdentifier
GlobalIdentifier
TableColumnIdentifier:
Identifier[@
Identifier]
GlobalIdentifier:
[@
Identifier]
Palabras clave de contexto
ContextKeyword:
Parent
Self
ThisItem
ThisRecord
Distinguir mayúsculas de minúsculas
Los nombres de identificadores Power Apps distinguen entre mayúsculas y minúsculas. La herramienta de creación los cambiará automáticamente al caso correcto cuando se escriba una fórmula.
Separadores
DecimalSeparator:
.
(punto) para idiomas que utilizan un punto como separador para números decimales, por ejemplo, 1.23
,
(coma) para lenguajes que usa una coma como separador para números decimales, por ejemplo 1,23
ListSeparator:
,
(coma) si DecimalSeparator es .
(punto)
;
(punto y coma) si DecimalSeparator es ,
(coma)
ChainingSeparator:
;
si DecimalSeparator es .
(punto)
;;
(doble punto y coma) si DecimalSeparator es ,
(coma)
Operadores
Los operadores se usan en formulas para describir las operaciones con uno o varios operandos implicados. Por ejemplo, la expresión a + b
usa el operador +
para agregar los dos operandos a
y b
.
Operator:
BinaryOperator
BinaryOperatorRequiresWhitespace
PrefixOperator
PrefixOperatorRequiresWhitespace
PostfixOperator
BinaryOperator:one of
=
<
<=
>
>=
<>
+
-
*
/
^
&
&&
||
in
exactin
BinaryOperatorRequiresWhitespace:
And
Whitespace
Or
Whitespace
PrefixOperatorRequiresWhitespace:
Not
Whitespace
Referencia de operador
Referencia del objeto
Reference:
BaseReference
BaseReferenceReferenceOperatorReferenceList
BaseReference:
Identifier
DisambiguatedIdentifier
ContextKeyword
ReferenceList:
Identifier
IdentifierReferenceOperatorReferenceList
Registro alineado
InlineRecord:
{
InlineRecordListopt}
InlineRecordList:
Identifier:
Expression
Identifier:
ExpressionListSeparatorInlineRecordList
Tabla alineada
InlineTable:
[
InlineTableListopt]
InlineTableList:
Expression
ExpressionListSeparatorInlineTableList
Expression
Expression:
Literal
Reference
InlineRecord
InlineTable
FunctionCall
(
Expression)
PrefixOperatorExpression
ExpressionPostfixOperator
ExpressionBinaryOperatorExpression
Expresiones encadenadas
ChainedExpression:
Expression
ExpressionChainingSeparatorChainedExpressionopt
Llamada a función
FunctionCall:
FunctionIdentifier(
FunctionArgumentsopt)
FunctionIdentifier:
Identifier
Identifier.
FunctionIdentifier
FunctionArguments:
ChainedExpression
ChainedExpressionListSeparatorFunctionArguments