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:
    AndWhitespace
    OrWhitespace

  PrefixOperator:
    !

  PrefixOperatorRequiresWhitespace:
    NotWhitespace

  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