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:
     [@ Identificator]

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:una 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:
     Spațiu alb
     Comentariu

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.

   Spațiu alb:
    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.

   Comentariu:
     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:
     LogicLiteral
     NumărLiteral
     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:una dintre
    0123456789

   ExponentPart:
     ExponentIndicatorSemnoptDecimalDigits

   ExponentIndicator:unul dintre
    eE

   Semnează:una dintre
    +-

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.

   Identificator:
     IdentifierNamedarnuOperatorsauContextKeyword

   IdentifierName:
     IdentifierStartCharacterIdentifierContinueCharactersopt
     ' SingleQuotedIdentifier'

   IdentifierStartCharacter:
     LiterăCaractere
    _

   IdentificatorContinueCharacter:
     IdentificatorStartCharacter
     DecimalDigitCharacter
     Personaj de conectare
     CombiningCharacter
     Formatarea caracterului

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

   Personaj de conectare:
    orice caracter Unicode al clasei Punctuație conector (Pc)

   Formatarea caracterului:
    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

   Identificator dezambiguat:
     TableColumnIdentifier
     GlobalIdentifier

   TableColumnIdentifier:
     Identificator[@Identificator]

   GlobalIdentifier:
     [@ Identificator]

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 numere zecimale, de exemplu 1.23
     , (virgulă) pentru limbile care folosesc virgula ca separator pentru numere zecimale, de exemplu 1,23

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

   ChainingSeparator:
     ; (punct și virgulă) dacă DecimalSeparator este . (punct)
     ;; (dublu punct și virgulă) dacă DecimalSeparator 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
     BinaryOperatorRequiresWhitspace
     PrefixOperator
     PrefixOperatorRequiresWhitspace
     PostfixOperator

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

   BinaryOperatorRequiresWhitspace:
     And Spațiu alb
     Or Spațiu alb

   PrefixOperator:
    !

   PrefixOperatorRequiresWhitspace:
     Not Spațiu alb

   PostfixOperator:
    %

Operator de referință

   ReferenceOperator:unul dintre
    .!

Referință obiect

   Referinţă:
     Referință de bază
     BaseReferenceReferenceOperatorReferenceList

   Referință de bază:
     Identificator
     DisambiguatedIdentifier
     ContextKeyword

   Lista de referințe:
     Identificator
     IdentificatorReferenceOperatorReferenceList

Înregistrare în linie

   InlineRecord:
     { InlineRecordListopt}

   InlineRecordList:
     Identificator:Expresie
     Identificator:ExpresieListSeparatorInlineRecordList

Tabel în linie

   InlineTable:
     [ InlineTableListopt]

   InlineTableList:
     Expresie
     ExpressionListSeparatorInlineTableList

Expression

   Expresie:
     Literal
     Referinţă
     InlineRecord
     InlineTable
     FunctionCall
     ( Expresie)
     PrefixOperatorExpresie
     ExpressionPostfixOperator
     ExpresieBinaryOperatorExpresie

Expresii înlănțuite

   ChainedExpression:
     Expresie
     ExpressionChainingSeparatorChainedExpressionopt

Apel de funcție

   FunctionCall:
     FunctionIdentifier(FunctionArgumentsopt)

   FunctionIdentifier:
     Identificator
     Identificator.FunctionIdentifier

   FunctionArguments:
     ChainedExpression
     ChainedExpressionListSeparatorFunctionArguments