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
0
1
2
3
4
5
6
7
8
9
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
true
false
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
0
1
2
3
4
5
6
7
8
9
ExponentPart:
ExponentIndicatorSemnoptDecimalDigits
ExponentIndicator:unul dintre
e
E
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
=
<
<=
>
>=
<>
+
-
*
/
^
&
&&
||
in
exactin
BinaryOperatorRequiresWhitspace:
And
Spațiu alb
Or
Spațiu alb
PrefixOperatorRequiresWhitspace:
Not
Spațiu alb
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