%%
%% Definition of different variables used within PHP and
%% the way to access them.
%%
%% @author Eric Bouwers
module languages/php/common/literals/VariableLiterals
exports
%% Variables can be defined in a lot of ways. A normal variable is a Dollar with
%% a label. But there can also be an array. A variable can also be made by a dollar
%% and an expression between curly braces.
sorts CompoundVariable Expr
context-free syntax
%% Reference variables. A normal variable, acces to an array or maybe acces to
%% a index in a string.
CompoundVariable -> ReferenceVariable
ReferenceVariable "[" Expr? "]" -> ReferenceVariable {cons("ArrayAccess")}
ReferenceVariable "{" Expr "}" -> ReferenceVariable {cons("StringAccess")}
%% There are two kind of variables defined. A TVariable which is a basic variable
%% and a CompundVariable that can be a complecated variable. A TVariable can be
%% used as a CompundVariable but not vice versa
sorts String TVariable SimpleVariableName
syntax
"$" <SimpleVariableName-CF> -> <TVariable-CF> {cons("Variable")}
"$" <VariableName-CF> -> <CompoundVariable-CF> {cons("Variable")}
%% Complex variable names
context-free syntax
SimpleVariableName -> VariableName
"{" SimpleVariableName "}" -> VariableName {prefer, cons("Braced")} %% we prefer this instead of a constant variable
"{" Expr "}" -> VariableName {cons("Braced")}
String -> SimpleVariableName {cons("Simple")}
%% A special place for constant variables.
sorts MagicConstant Keyword ConstantVariable
context-free syntax
String -> ConstantVariable {cons("ConstantVariable")}
MagicConstant -> ConstantVariable{reject}
Keyword -> ConstantVariable{reject}
%% These definitions represent the accessing of an object or an array.
%% The language parser does not see this as epxressions. So this is placed
%% here because the variables are related.
sorts ReferenceVariable ObjectProperty VariableName
CVar ObjectCVar ObjectFunctionCall CallParam Variable
context-free syntax
%% Included in language parser. Only translated it to assign things to the
%% Expr. It expresses the accesing of normal variables and the
%% variables inside objects
ObjectCVar -> Variable
ObjectFunctionCall -> Variable
ReferenceVariable -> CVar
"$" CVar -> CVar {cons("IndirectReference")}
CVar -> ObjectCVar
ObjectCVar "->" ObjectProperty -> ObjectCVar {cons("ObjectAccess")}
ObjectCVar -> ObjectProperty {cons("ObjectProperty")}
VariableName -> ObjectProperty {cons("ObjectProperty")}
ObjectProperty "[" Expr? "]" -> ObjectProperty {cons("ArrayAccess")}
ObjectProperty "{" Expr "}" -> ObjectProperty {cons("StringAccess")}
ObjectCVar "->" ObjectProperty "(" {CallParam ","}* ")" -> ObjectFunctionCall {cons("FunctionCall")}
%% The following Variables are special variables and should be recognized as such
sorts Bool Null
context-free syntax
'true' -> Bool {cons("True")}
'false' -> Bool {cons("False")}
'null' -> Null {cons("Null")}