Compartir vía


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
    0123456789

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
    truefalse

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
    0123456789

   ExponentPart:
     ExponentIndicatorSignoptDecimalDigits

   ExponentIndicator:one of
    eE

   Sign:one of
    +-

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
    =<<=>>=<>
    +-*/^
    &
    &&||
    inexactin

   BinaryOperatorRequiresWhitespace:
     And Whitespace
     Or Whitespace

   PrefixOperator:
    !

   PrefixOperatorRequiresWhitespace:
     Not Whitespace

   PostfixOperator:
    %

Referencia de operador

   ReferenceOperator:one of
    .!

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