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:
    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
    0123456789

é 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
    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

  DecimalDigits:
    DecimalDigit
    DecimalDigitsDecimalDigit

  DecimalDigit:one of
    0123456789

  ExponentPart:
    ExponentIndicatorSignoptDecimalDigits

  ExponentIndicator:one of
    eE

  Sign:one of
    +-

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

  BinaryOperatorRequiresWhitespace:
    AndEspazo en branco
    OrEspazo en branco

  PrefixOperator:
    !

  PrefixOperatorRequiresWhitespace:
    NotEspazo en branco

  PostfixOperator:
    %

Operador de referencia

  ReferenceOperator:one of
    .!

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