Grammatica delle espressioni
Nota
Microsoft Power Fx è il nuovo nome per il linguaggio delle formule per le app canvas. Questi articoli sono in fase di elaborazione poiché estraiamo il linguaggio dalle app canvas, lo integriamo con altri prodotti di Microsoft Power Platform e lo rendiamo disponibile come open source. Inizia con la panoramica di Microsoft Power Fx per un'introduzione al linguaggio.
Microsoft Power Fx si basa su formule che associano un nome a un'espressione. Proprio come nei fogli di lavoro di Excel, quando le dipendenze in ingresso all'espressione cambiano, l'espressione viene ricalcolata e il valore del nome cambia, possibilmente propagando a catena il ricalcolo in altre formule.
Questa grammatica copre la parte dell'espressione della formula. L'associazione a un nome per creare una formula dipende da come è integrato Power Fx. Nei fogli di lavoro, la sintassi di associazione non è esposta, è implicita nella posizione in cui è scritta l'espressione, ad esempio inserendo =B1
nella cella A1. In alcuni casi, non è richiesta alcuna associazione e Power Fx viene utilizzato come analizzatore di espressioni, ad esempio per supportare le colonne calcolate di una tabella di database. Per Power Apps, l'associazione è implicita quando si lavora in Power Apps Studio con un formato di serializzazione basato su YAML per l'uso al di fuori di Power Apps Studio.
Convenzioni grammaticali
Le grammatiche lessicali e sintattiche vengono presentate usando produzioni grammaticali. Ogni produzione grammaticale definisce un simbolo non terminale e le possibili espansioni di quel simbolo non terminale, in sequenze di simboli terminali o non terminali. Nelle produzioni grammaticali, i simboli non terminali vengono visualizzati in corsivo e i simboli terminal in un tipo di carattere a larghezza fissa.
La prima riga di una produzione grammaticale corrisponde al nome del simbolo non terminale definito, seguito da due punti. Ogni successiva riga rientrata contiene una possibile espansione del simbolo non terminale, specificata come sequenza di simboli terminali o non terminali. Ad esempio, la produzione:
GlobalIdentifier:
[@
Identifier]
definisce un GlobalIdentifier per farlo consistere nel token [@
, seguito da un Identificatore, seguito dal token ]
.
Se esiste più di un'espansione possibile per un simbolo non terminale, le alternative vengono elencate in righe separate. Per indicare un simbolo facoltativo, viene usato il pedice "opt". Ad esempio, la produzione:
FunctionCall:
FunctionIdentifier(
FunctionArgumentsopt)
è una sintassi abbreviata per:
FunctionCall:
FunctionIdentifier(
)
FunctionIdentifier(
FunctionArguments)
Le alternative, in genere, sono elencate in righe separate ma, nel caso in cui esistano molte alternative, la frase "uno di" può precedere un elenco di espansioni in una singola riga. Si tratta semplicemente di una sintassi abbreviata per elencare ognuna delle alternative in righe separate.
Ad esempio, la produzione:
DecimalDigit:one of
0
1
2
3
4
5
6
7
8
9
è una sintassi abbreviata per:
DecimalDigit:
0
1
2
3
4
5
6
7
8
9
Analisi lessicale
La produzione di unità lessicali definisce la grammatica lessicale per un'espressione Power Fx. Ogni espressione Power Fx valida è conforme a questa grammatica.
ExpressionUnit:
ExpressionElementsopt
ExpressionElements:
ExpressionElement
ExpressionElementExpressionElementsopt
ExpressionElement:
Whitespace
Comment
A livello lessicale, un'espressione Power Fx è costituita da un flusso di elementi Whitespace, Comment e Token. Ciascuna di queste produzioni viene trattata nelle sezioni seguenti. Nella grammatica sintattica solo gli elementi Token sono significativi.
Spazio vuoto
In un documento Power Apps, per separare commenti e token viene usato uno spazio vuoto.
Whitespace:
qualsiasi separatore di spazio Unicode (classe Zs)
qualsiasi separatore di riga Unicode (classe Zl)
qualsiasi separatore di paragrafo Unicode (classe Zp)
Carattere di tabulazione orizzontale (U+0009)
Carattere di avanzamento riga (U+000A)
Carattere di tabulazione verticale (U+000B)
Carattere di avanzamento carta (U+000C)
Carattere di ritorno a capo (U+000D)
Carattere di nuova riga (U+0085)
Commenti
Sono supportate due forme di commenti:
- I commenti su riga singola che iniziano con i caratteri
//
e si estendono fino alla fine della riga di origine. - I commenti delimitati che iniziano con i caratteri
/*
e terminano con i caratteri*/
. I commenti delimitati possono estendersi su più righe.
Comment:
DelimitedComment
SingleLineComment
SingleLineComment:
//
SingleLineCommentCharactersopt
SingleLineCommentCharacters:
SingleLineCommentCharacter
SingleLineCommentCharacterSingleLineCommentCharactersopt
SingleLineCommentCharacter:
qualsiasi carattere Unicode tranne NewLineCharacter
DelimitedComment:
/*
DelimitedCommentCharactersopt*/
DelimitedCommentCharacters:
DelimitedCommentCharactersNoAsteriskDelimitedCommentCharactersopt
*
DelimitedCommentAfterAsteriskCharacters
DelimitedCommentAfterAsteriskCharacters:
DelimitedCommentNoSlashAsteriskCharacterDelimitedCommentCharactersopt
*
DelimitedCommentAfterAsteriskCharacters
DelimitedCommentCharactersNoAsterisk:
qualsiasi carattere Unicode ad eccezione di * (asterisco)
DelimitedCommentNoSlashAsteriskCharacter:
qualsiasi carattere Unicode ad eccezione di / (barra) o * (asterisco)
I commenti non sono nidificati. Le sequenze di caratteri /*
e */
non hanno un significato speciale in un commento su riga singola, così come le sequenze di caratteri //
e /*
non hanno un significato speciale in un commento delimitato.
I commenti non vengono elaborati all'interno di stringhe letterali di testo.
L'esempio seguente include due commenti delimitati:
/* Hello, world
*/
"Hello, world" /* This is an example of a text literal */
I seguenti esempi includono tre commenti su una sola riga:
// Hello, world
//
"Hello, world" // This is an example of a text literal
Letterali
Un valore letterale è una rappresentazione del codice sorgente di un valore.
Literal:
LogicalLiteral
NumberLiteral
TextLiteral
Valori letterali logici
Per scrivere i valori true e false viene usato un valore letterale logico, che produce un valore logico.
LogicalLiteral:one of
true
false
Valori letterali numerici
Per scrivere un valore numerico viene usato un valore letterale numerico, che produce un valore numerico.
NumberLiteral:
DecimalDigitsExponentPartopt
DecimalDigitsDecimalSeparatorDecimalDigitsoptExponentPartopt
DecimalSeparatorDecimalDigitsExponentPartopt
DecimalDigits:
DecimalDigit
DecimalDigitsDecimalDigit
DecimalDigit:one of
0
1
2
3
4
5
6
7
8
9
ExponentPart:
ExponentIndicatorSignoptDecimalDigits
Valori letterali di testo
Per scrivere una sequenza di caratteri Unicode viene usato un valore letterale di testo, che produce un valore di testo. I valori letterali di testo sono racchiusi tra virgolette doppie. Per includere virgolette doppie nel valore del testo, ripeti le virgolette doppie, come mostrato nell'esempio seguente:
"The ""quoted"" text" // The "quoted" text
TextLiteral:
"
TextLiteralCharactersopt"
TextLiteralCharacters:
TextLiteralCharacterTextLiteralCharactersopt
TextLiteralCharacter:
TextCharacterNoDoubleQuote
DoubleQuoteEscapeSequence
TextCharacterNoDoubleQuote:
qualsiasi punto di codice Unicode tranne le virgolette doppie
DoubleQuoteEscapeSequence:
"
"
Identifiers
Con il termine identificatore si fa riferimento a un valore. Gli identificatori possono essere regolari o a virgolette singole.
Identifier:
IdentifierNamemanonOperatoro ContextKeyword
IdentifierName:
IdentifierStartCharacterIdentifierContinueCharactersopt
'
SingleQuotedIdentifier'
IdentifierStartCharacter:
LetterCharacter
_
IdentifierContinueCharacter:
IdentifierStartCharacter
DecimalDigitCharacter
ConnectingCharacter
CombiningCharacter
FormattingCharacter
IdentifierContinueCharacters:
IdentifierContinueCharacterIdentifierContinueCharactersopt
LetterCharacter:
qualsiasi carattere Unicode della classe Lettera maiuscola (Lu) o Lettera minuscola (Ll)
qualsiasi carattere Unicode della classe Lettera iniziale maiuscola (Lt)
qualsiasi carattere Unicode della classe Lettera modificatore (Lm) o Lettera altro (Lo)
qualsiasi carattere Unicode della classe Lettera numero (NI)
CombiningCharacter:
qualsiasi carattere Unicode della classe Segno senza spaziatura (Mn) o Segno di combinazione spaziatura (Mc)
DecimalDigitCharacter:
qualsiasi carattere Unicode della classe Cifra decimale (Nd)
ConnectingCharacter:
qualsiasi carattere Unicode della classe Punteggiatura connettore (Pc)
FormattingCharacter:
qualsiasi carattere Unicode della classe Formato (Cf)
Identificatori con virgolette singole
Un identificatore con virgolette singole può contenere qualsiasi sequenza di caratteri Unicode da usare come identificatore, tra cui parole chiave, spazi vuoti, commenti e operatori. I caratteri delle virgolette singole sono supportati con una sequenza di escape di due virgolette singole.
SingleQuotedIdentifier:
SingleQuotedIdentifierCharacters
SingleQuotedIdentifierCharacters:
SingleQuotedIdentifierCharacterSingleQuotedIdentifierCharactersopt
SingleQuotedIdentifierCharacter:
TextCharactersNoSingleQuote
SingleQuoteEscapeSequence
TextCharactersNoSingleQuote:
qualsiasi carattere Unicode ad eccezione di ' (U+0027)
SingleQuoteEscapeSequence:
'
'
Identificatore disambiguato
DisambiguatedIdentifier:
TableColumnIdentifier
GlobalIdentifier
TableColumnIdentifier:
Identifier[@
Identifier]
GlobalIdentifier:
[@
Identifier]
Parole chiave del contesto
ContextKeyword:
Parent
Self
ThisItem
ThisRecord
Distinzione tra maiuscole e minuscole
Gli identificatori di Power Apps sono sensibili al maiuscolo/minuscolo. Lo strumento di creazione li modificherà automaticamente nel formato corretto quando viene scritta una formula.
Separatori
DecimalSeparator:
.
(punto) per le lingue che utilizzano un punto come separatore per i numeri decimali, ad esempio 1.23
,
(virgola) per le lingue che utilizzano una virgola come separatore per i numeri decimali, ad esempio 1,23
ListSeparator:
,
(virgola) se DecimalSeparator è .
(punto)
;
(punto e virgola) se DecimalSeparator è ,
(virgola)
ChainingSeparator:
;
(punto e virgola) se DecimalSeparator è .
(punto)
;;
(doppio punto e virgola) se DecimalSeparator è ,
(virgola)
Operatori
Gli operatori vengono usati nelle formule per descrivere le operazioni che includono uno o più operandi. L'espressione a + b
, ad esempio, usa l'operatore +
per aggiungere i due operandi a
e b
.
Operator:
BinaryOperator
BinaryOperatorRequiresWhitespace
PrefixOperator
PrefixOperatorRequiresWhitespace
PostfixOperator
BinaryOperator:one of
=
<
<=
>
>=
<>
+
-
*
/
^
&
&&
||
in
exactin
BinaryOperatorRequiresWhitespace:
And
Whitespace
Or
Whitespace
PrefixOperatorRequiresWhitespace:
Not
Whitespace
Operatore di riferimento
Riferimento a un oggetto
Reference:
BaseReference
BaseReferenceReferenceOperatorReferenceList
BaseReference:
Identifier
DisambiguatedIdentifier
ContextKeyword
ReferenceList:
Identifier
IdentifierReferenceOperatorReferenceList
Record in linea
InlineRecord:
{
InlineRecordListopt}
InlineRecordList:
Identifier:
Expression
Identifier:
ExpressionListSeparatorInlineRecordList
Tabella in linea
InlineTable:
[
InlineTableListopt]
InlineTableList:
Expression
ExpressionListSeparatorInlineTableList
Expression
Expression:
Literal
Reference
InlineRecord
InlineTable
FunctionCall
(
Expression)
PrefixOperatorExpression
ExpressionPostfixOperator
ExpressionBinaryOperatorExpression
Espressioni concatenate
ChainedExpression:
Expression
ExpressionChainingSeparatorChainedExpressionopt
Chiamata funzione
FunctionCall:
FunctionIdentifier(
FunctionArgumentsopt)
FunctionIdentifier:
Identifier
Identifier.
FunctionIdentifier
FunctionArguments:
ChainedExpression
ChainedExpressionListSeparatorFunctionArguments