Partajați prin


Gramatica de expresie

Notă

Microsoft Power Fx este noul nume pentru limbajul formulă pentru aplicații pânză. Aceste articole sunt o lucrare în curs de desfășurare, deoarece extragem limba din aplicațiile pânză, o integrăm cu alte produse Microsoft Power Platform și le punem la dispoziție ca open source. Începeți cu prezentarea generală Microsoft Power Fx pentru o introducere în limbă.

Microsoft Power Fx se bazează pe formule care leagă un nume de o expresie. La fel ca în foile de lucru Excel, ca dependențe de intrare față de expresia se schimbă, expresia este recalculată și valoarea numelui se schimbă, eventual recalcularea în cascadă în alte formule.

Această gramatică acoperă partea de expresie a formulei. Legătura la un nume pentru a crea o formulă depinde de modul în care este integrat Power Fx. În foile de lucru, sintaxa de legare nu este expusă, este implicată de locația în care este scrisă expresia—de exemplu, introducerea =B1 în celula A1. În unele cazuri, nu este necesară nicio legătură și Power Fx este utilizat ca evaluator de expresii, de exemplu în susținerea coloanelor calculate ale unui tabel de baze de date. Pentru Power Apps, legarea este implicită atunci când lucrați în Power Apps Studio cu un format de serializare bazat pe YAML pentru utilizare în exteriorul Power Apps Studio.

Convenții gramaticale

Gramaticile lexicale și sintactice sunt prezentate folosind producții gramaticale. Fiecare producție gramaticală definește un simbol non-terminal și posibilele expansiuni ale acelui simbol non-terminal în secvențe de simboluri non-terminale sau terminale. În producțiile gramaticale, simbolurile non-terminale sunt afișate în cursiv, iar simbolurile terminale sunt afișate într-un font cu lățime fixă.

Prima linie a unei producții gramaticale este numele simbolului non-terminal care este definit, urmat de două puncte. Fiecare linie indentată succesivă conține o posibilă extindere a simbolului non-terminal dat ca o succesiune de simboluri non-terminale sau terminale. De exemplu, producția:

  GlobalIdentifier:
    [@Identifier]

definește un GlobalIdentifier pentru a consta din tokenul [@, urmat de un Identificator, urmat de token ].

Când există mai multe extinderi posibile ale unui simbol non-terminal, alternativele sunt listate pe linii separate. Indicele „optare” este utilizat pentru a indica un simbol opțional. De exemplu, producția:

  FunctionCall:
    FunctionIdentifier(FunctionArgumentsopt)

este prescurtare pentru:

  FunctionCall:
    FunctionIdentifier()
    FunctionIdentifier(FunctionArguments)

Alternativele sunt în mod normal listate pe linii separate, deși în cazurile în care există multe alternative, sintagma „una dintre” ar putea preceda o listă de extinderi date pe o singură linie. Aceasta este pur și simplu prescurtare pentru listarea fiecărei alternative pe linii separate.

De exemplu, producția:

  DecimalDigit:unul dintre
    0123456789

este prescurtare pentru:

  DecimalDigit:
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9

Analiza lexicală

Producția de unități lexicale definește gramatica lexicală pentru o expresie Power Fx. Fiecare expresie validă Power Fx conformă cu această gramatică.

  ExpressionUnit:
    ExpressionElementsopt

  ExpressionElements:
    ExpressionElement
    ExpressionElementExpressionElementsopt

  ExpressionElement:
    Whitespace
    Comment

La nivel lexical, o expresie Power Fx constă dintr-un flux de elemente Spațiu alb, Cometariu și Token. Fiecare dintre aceste producții este acoperită în secțiunile următoare. Numai elementele Token sunt semnificative în gramatica sintactică.

Spațiu

Spațiul alb este utilizat pentru a separa comentariile și tokenurile din cadrul unui document Power Apps.

  Whitespace:
    orice separator Unicode Space (clasa Zs)
    orice separator Unicode Line (clasa ZI)
    orice separator de paragraf Unicode (clasa Zp)
    Filă caracter orizontal (U+0009)
    Caracter de alimentare de linie (U+000A)
    Filă caracter vertical (U+000B)
    Caracter de alimentare de formular (U+000C)
    Caracter de sfârșit de linie (U+000D)
    Caracter pentru linia următoare (U+0085)

Comentarii

Sunt acceptate două forme de comentarii:

  • Comentarii cu o singură linie care încep cu caracterele // și se extind până la sfârșitul liniei sursă.
  • Comentarii delimitate care încep cu personajele /* și se termină cu caracterele */. Comentariile delimitate pot cuprinde mai multe linii.

  Comment:
    DelimitedComment
    SingleLineComment

  SingleLineComment:
    //SingleLineCommentCharactersopt

  SingleLineCommentCharacters:
    SingleLineCommentCharacter
    SingleLineCommentCharacterSingleLineCommentCharactersopt

  SingleLineCommentCharacter:
    orice caractere Unicode, cu excepția unui NewLineCharacter

  DelimitedComment:
    /*DelimitedCommentCharactersopt*/

  DelimitedCommentCharacters:
    DelimitedCommentCharactersNoAsteriskDelimitedCommentCharactersopt
    *DelimitedCommentAfterAsteriskCharacters

  DelimitedCommentAfterAsteriskCharacters:
    DelimitedCommentNoSlashAsteriskCharacterDelimitedCommentCharactersopt
    *DelimitedCommentAfterAsteriskCharacters

  DelimitedCommentCharactersNoAsterisk:
    orice caracter Unicode cu excepția * (asterisc)

  DelimitedCommentNoSlashAsteriskCharacter:
    orice caracter Unicode cu excepția unei bare oblice sau * (asterisc)

Comentariile nu sunt imbricate. Secvențele caracterelor /* și */ nu au o semnificație specială în cadrul unui comentariu de o singură șinie și secvențele caracterelor // și /* nu au o semnificație specială în cadrul unui comentariu delimitat.

Comentariile nu sunt procesate în șiruri text-literal.

Următorul exemplu include două comentarii delimitate:

/* Hello, world
*/
"Hello, world"    /* This is an example of a text literal */

Următoarele exemple includ trei comentarii cu o singură linie:

// Hello, world
//
"Hello, world"    // This is an example of a text literal

Litere

Un literal este o reprezentare a codului sursă al unei valori.

  Literal:
    LogicalLiteral
    NumberLiteral
    TextLiteral

Literali logici

Un literal logic este folosit pentru a scrie valorile adevărat și fals și pentru a produce o valoare logică.

  LogicalLiteral:unul dintre
    truefalse

Numerale literale

Un număr literal este folosit pentru a scrie o valoare numerică și a produce o valoare numerică.

  NumberLiteral:
    DecimalDigitsExponentPartopt
    DecimalDigitsDecimalSeparatorDecimalDigitsoptExponentPartopt
    DecimalSeparatorDecimalDigitsExponentPartopt

  DecimalDigits:
    DecimalDigit
    DecimalDigitsDecimalDigit

  DecimalDigit:unul din
    0123456789

  ExponentPart:
    ExponentIndicatorSignoptDecimalDigits

  ExponentIndicator:one of
    eE

  Sign:one of
    +-

Textul literal

Un text literal este folosit pentru a scrie o secvență de caractere Unicode și pentru a produce o valoare text. Literalele textului sunt încadrate între ghilimele duble. Pentru a include ghilimele duble în valoarea textului, repetați ghilimele duble, așa cum se arată în următorul exemplu:

"The ""quoted"" text" // The "quoted" text

  TextLiteral:
    "TextLiteralCharactersopt"

  TextLiteralCharacters:
    TextLiteralCharacterTextLiteralCharactersopt

  TextLiteralCharacter:
    TextCharacterNoDoubleQuote
    DoubleQuoteEscapeSequence

  TextCharacterNoDoubleQuote:
    orice punct de cod Unicode, cu excepția ghilimelelor duble

  DoubleQuoteEscapeSequence:
    ""

Identifiers

Un identificator este un nume folosit pentru a se referi la o valoare. Identificatorii pot fi fie identificatori obișnuiți, fie identificatori citați individual.

  Identifier:
    IdentifierNamebutnotOperatororContextKeyword

  IdentifierName:
    IdentifierStartCharacterIdentifierContinueCharactersopt
    'SingleQuotedIdentifier'

  IdentifierStartCharacter:
    LetterCharacter
    _

  IdentifierContinueCharacter:
    IdentifierStartCharacter
    DecimalDigitCharacter
    ConnectingCharacter
    CombiningCharacter
    FormattingCharacter

  IdentifierContinueCharacters:
    IdentifierContinueCharacterIdentifierContinueCharactersopt

  LetterCharacter:
    orice caracter Unicode al clasei Majusculă (Lu) sau Literă mică (Ll)
    orice caracter Unicode al clasei Literă inițială majusculă (Lt)
    orice caracter Unicode al clase Modificator de literă (Lm) sau Altă literă (Lo)
    orice caracter Unicode din clasa Literă număr (Nl)

  CombiningCharacter:
    orice caracter Unicode al clasei Marcă fără spațiu (Mn) sau Distanța care combină marca (Mc)

  DecimalDigitCharacter:
    orice caracter Unicode al clasei Cifră zecimală (Nd)

  ConnectingCharacter:
    orice caracter Unicode al clasei Punctuație conector (Pc)

  FormattingCharacter:
    orice caracter Unicode al clasei Format (Cf)

Identificatori cotați singuri

Un identificator unic citat poate conține orice secvență de caractere Unicode pentru a fi utilizate ca identificator, inclusiv cuvinte cheie, spațiu alb, comentarii și operatori. Caracterele ghilimelelor unice sunt acceptate cu o secvență de evadare de două ghilimele unice.

  SingleQuotedIdentifier:
    SingleQuotedIdentifierCharacters

  SingleQuotedIdentifierCharacters:
    SingleQuotedIdentifierCharacterSingleQuotedIdentifierCharactersopt

  SingleQuotedIdentifierCharacter:
    TextCharactersNoSingleQuote
    SingleQuoteEscapeSequence

  TextCharactersNoSingleQuote:
    orice caracter Unicode cu excepția ' (U+0027)

  SingleQuoteEscapeSequence:
    ''

Identificator dezambiguizat

  DisambiguatedIdentifier:
    TableColumnIdentifier
    GlobalIdentifier

  TableColumnIdentifier:
    Identifier[@Identifier]

  GlobalIdentifier:
    [@Identifier]

Cuvinte cheie contextuale

  ContextKeyword:
    Parent
    Self
    ThisItem
    ThisRecord

Diferențiere litere mari și mici

Identificatorii Power Apps fac diferența între litere mari și mici. Instrumentul de creație le va schimba automat în cazul corect atunci când se scrie o formulă.

Separatoare

  DecimalSeparator:
    . (punct) pentru limbile care folosesc un punct ca separator pentru numerele zecimale, de exemplu 1.23
    , (virgulă) pentru limbile care utilizează o virgulă ca separator pentru numerele zecimale, de exemplu 1,23

  ListSeparator:
    , (virgulă) if DecimalSeparator este . (punct)
    ; (punct și virgulă) dacă Separator zecimal este , (virgulă)

  ChainingSeparator:
    ; (punct și virgulă) dacă Separator zecimal este . (punct)
    ;; (punct și virgulă dublu) dacă Separator zecimal este , (virgulă)

Operators

Operatorii sunt utilizați în formule pentru a descrie operații care implică unul sau mai mulți operanzi. De exemplu, expresia a + b folosește + operator pentru a adăuga cei doi operanzi a și b.

  Operator:
    BinaryOperator
    BinaryOperatorRequiresWhitespace
    PrefixOperator
    PrefixOperatorRequiresWhitespace
    PostfixOperator

  BinaryOperator:unul dintre
    =<<=>>=<>
    +-*/^
    &
    &&||
    inexactin

  BinaryOperatorRequiresWhitespace:
    AndWhitespace
    OrWhitespace

  PrefixOperator:
    !

  PrefixOperatorRequiresWhitespace:
    NotWhitespace

  PostfixOperator:
    %

Operator de referință

  ReferenceOperator:unul dintre
    .!

Referință obiect

  Reference:
    BaseReference
    BaseReferenceReferenceOperatorReferenceList

  BaseReference:
    Identifier
    DisambiguatedIdentifier
    ContextKeyword

  ReferenceList:
    Identifier
    IdentifierReferenceOperatorReferenceList

Înregistrare în linie

  InlineRecord:
    {InlineRecordListopt}

  InlineRecordList:
    Identifier:Expression
    Identifier:ExpressionListSeparatorInlineRecordList

Tabel în linie

  InlineTable:
    [InlineTableListopt]

  InlineTableList:
    Expression
    ExpressionListSeparatorInlineTableList

Expression

  Expression:
    Literal
    Reference
    InlineRecord
    InlineTable
    FunctionCall
    (Expression)
    PrefixOperatorExpression
    ExpressionPostfixOperator
    ExpressionBinaryOperatorExpression

Expresii înlănțuite

  ChainedExpression:
    Expression
    ExpressionChainingSeparatorChainedExpressionopt

Apel de funcție

  FunctionCall:
    FunctionIdentifier(FunctionArgumentsopt)

  FunctionIdentifier:
    Identifier
    Identifier.FunctionIdentifier

  FunctionArguments:
    ChainedExpression
    ChainedExpressionListSeparatorFunctionArguments