Compartir por


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:
    Identificador de función()
    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:unha de
    0123456789

é a abreviatura de:

  Cifra decimal:
    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
    Comenta

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:
    Comentario delimitado
    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:
    LóxicoLiteral
    NúmeroLiteral
    Texto literal

Literais lóxicos

Un literal lóxico úsase para escribir os valores verdadeiro e falso e producir un valor lóxico.

  LóxicoLiteral:unha de
    truefalse

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

  Cifras decimais:
    Díxito decimal
    DecimalDigitsDíxito decimal

  DecimalDigit:unha de
    0123456789

  ExponentPart:
    ExponentIndicatorSignoptDíxitos decimais

  ExponentIndicator:unha de
    eE

  Asina:unha de
    +-

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.

  Identificador:
    IdentifierNameperononOperadorouContextKeyword

  IdentifierName:
    IdentifierStartCharacterIdentifierContinueCharactersopt
    'SingleQuotedIdentifier'

  IdentifierStartCharacter:
    LetraCaracter
    _

  IdentificadorContinueCharacter:
    Identificador de inicioCaracter
    Carácter DecimalDíxito
    Personaxe de conexión
    Carácter combinado
    Formato de caracteres

  IdentificadorContinueCharacters:
    IdentifierContinueCharacterIdentifierContinueCharactersopt

  LetraCaracter:
    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)

  Personaxe de conexión:
    calquera carácter Unicode da clase Puntuación de conector (Pc)

  Formato do carácter:
    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
    Single QuoteEscapeSequence

  TextCharactersNoSingleQuote:
    calquera carácter Unicode excepto ' (U+0027)

  SingleQuoteEscapeSequence:
    ''

Identificador sen ambigüidade

  Identificador desambiguado:
    TableColumnIdentifier
    GlobalIdentifier

  TableColumnIdentifier:
    Identificador[@Identificador]

  GlobalIdentifier:
    [@Identificador]

Palabras clave de contexto

  Palabra clave de contexto:
    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

  Separador decimal:
    . (punto) para linguas que usan un punto como separador de números decimais, por exemplo 1.23
    , (coma) para linguas que usan coma como separador de números decimais, por exemplo 1,23

  ListSeparator:
    , (coma) se DecimalSeparator é . (punto)
    ; (punto e coma) se DecimalSeparator é , (coma)

  Separador de encadeamento:
    ; (punto e coma) se DecimalSeparator é . (punto)
    ;; (punto e coma) 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:
    Operador binario
    BinaryOperatorRequiresWhitspace
    Operador de prefixos
    PrefixOperatorRequiresWhitspace
    PostfixOperator

  BinaryOperator:un dos
    =<<=>>=<>
    +-*/^
    &
    &&||
    inexactin

  BinaryOperatorRequiresWhitspace:
    AndEspazo en branco
    OrEspazo en branco

  Operador de prefixo:
    !

  PrefixOperatorRequiresWhitspace:
    NotEspazo en branco

  PostfixOperator:
    %

Operador de referencia

  ReferenceOperator:unha de
    .!

Referencia do obxecto

  Referencia:
    BaseReference
    BaseReferenceReferenceOperatorReferenceList

  Referencia base:
    Identificador
    Identificador desambiguado
    Palabra clave de contexto

  Lista de referencia:
    Identificador
    IdentificadorReferenceOperatorReferenceList

Rexistro en liña

  Inline Record:
    {InlineRecordListopt}

  InlineRecordList:
    Identificador:Expresión
    Identificador:ExpresiónListSeparatorInlineRecordList

Táboa en liña

  InlineTable:
    [InlineTableListopt]

  InlineTableList:
    Expresión
    ExpresiónListSeparatorInlineTableList

Expression

  Expresión:
    Literal
    Referencia
    InlineRecord
    InlineTable
    FunctionCall
    (Expresión)
    PrefixOperatorExpresión
    ExpresiónPostfixOperator
    ExpresiónBinaryOperatorExpresión

Expresións encadeadas

  Expresión encadeada:
    Expresión
    ExpresiónChainingSeparatorChainedExpressionopt

Chamada de función

  FunctionCall:
    FunctionIdentifier(FunctionArgumentsopt)

  Identificador de función:
    Identificador
    Identificador.Identificador de función

  Argumentos da función:
    Expresión encadeada
    ChainedExpressionListSeparatorFunctionArguments