%%
%% Module with operators shared by PHP4 and PHP5.
%%
%% @author Eric Bouwers
module languages/php/common/Operators
exports
sorts CallParam String Expr CVar
lexical restrictions
"+" -/- [\+]
"-" -/- [\-]
"<" -/- [\>]
'new' -/- [a-zA-Z0-9\_] %% prevents ambiguity with function call that starts with new..
context-free syntax
"(" Expr ")" -> Expr {bracket}
context-free syntax
%% Assignment
ObjectCVar "=" Expr -> Expr {cons("Assign")}
ObjectCVar "+=" Expr -> Expr {cons("PlusAssign")}
ObjectCVar "-=" Expr -> Expr {cons("MinAssign")}
ObjectCVar "*=" Expr -> Expr {cons("MulAssign")}
ObjectCVar "/=" Expr -> Expr {cons("DivAssign")}
ObjectCVar ".=" Expr -> Expr {cons("ConcatAssign")}
ObjectCVar "%=" Expr -> Expr {cons("ModAssign")}
ObjectCVar "&=" Expr -> Expr {cons("AndAssign")}
ObjectCVar "|=" Expr -> Expr {cons("OrAssign")}
ObjectCVar "^=" Expr -> Expr {cons("XorAssign")}
ObjectCVar "<<=" Expr -> Expr {cons("SLAssign")}
ObjectCVar ">>=" Expr -> Expr {cons("SRAssign")}
context-free syntax
%% Increment / Decrement
ObjectCVar "++" -> Expr {cons("PostInc")}
"++" ObjectCVar -> Expr {cons("PreInc")}
ObjectCVar "--" -> Expr {cons("PostDec")}
"--" ObjectCVar -> Expr {cons("PreDec")}
context-free syntax
%% Logical / Bitwise
Expr "||" Expr -> Expr {left,cons("Or")}
Expr "&&" Expr -> Expr {left,cons("And")}
Expr 'or' Expr -> Expr {left,cons("LOr")}
Expr 'and' Expr -> Expr {left,cons("LAnd")}
Expr 'xor' Expr -> Expr {left,cons("LXor")}
Expr "|" Expr -> Expr {left,cons("BinOr")}
Expr "&" Expr -> Expr {left,cons("BinAnd")}
Expr "^" Expr -> Expr {left,cons("BinXor")}
context-free syntax
%% Arithmetic / bitwise
Expr "." Expr -> Expr {left,cons("Concat")}
Expr "+" Expr -> Expr {left,cons("Plus")}
Expr "-" Expr -> Expr {left,cons("Min")}
Expr "*" Expr -> Expr {left,cons("Mul")}
Expr "/" Expr -> Expr {left,cons("Div")}
Expr "%" Expr -> Expr {left,cons("Mod")}
Expr "<<" Expr -> Expr {left,cons("SL")}
Expr ">>" Expr -> Expr {left,cons("SR")}
%%&
%% Unary
%%
%% Bug in PHP grammar: there is no separate precedence
%% for unary operators. This means results in prefer semantics.
%%%
context-free syntax
"+" Expr -> Expr {cons("Positive"), prefer}
"-" Expr -> Expr {cons("Negative"), prefer}
"!" Expr -> Expr {cons("Not")}
"~" Expr -> Expr {cons("Neg")}
context-free syntax
%% Cast
'(int)' Expr -> Expr {cons("IntCast")}
'(integer)' Expr -> Expr {cons("IntCast")}
'(bool)' Expr -> Expr {cons("BoolCast")}
'(boolean)' Expr -> Expr {cons("BoolCast")}
'(real)' Expr -> Expr {cons("FloatCast")}
'(double)' Expr -> Expr {cons("FloatCast")}
'(float)' Expr -> Expr {cons("FloatCast")}
'(string)' Expr -> Expr {cons("StringCast"),prefer}
'(array)' Expr -> Expr {cons("ArrayCast")}
'(object)' Expr -> Expr {cons("ObjectCast")}
'(unset)' Expr -> Expr {cons("NullCast")}
context-free syntax
%% Comparison
Expr "===" Expr -> Expr {cons("IsIdentical")}
Expr "!==" Expr -> Expr {cons("IsNotIdentical")}
Expr "==" Expr -> Expr {cons("IsEqual")}
Expr "!=" Expr -> Expr {cons("IsNotEqual")}
Expr "<>" Expr -> Expr {cons("IsNotEqual")}
Expr "<" Expr -> Expr {cons("Less")}
Expr "<=" Expr -> Expr {cons("LessEqual")}
Expr ">" Expr -> Expr {cons("Greater")}
Expr ">=" Expr -> Expr {cons("GreaterEqual")}
context-free syntax
%% Ternary
Expr "?" Expr ":" Expr -> Expr {left,cons("Ternary")}
context-free syntax
%% Error
"@" Expr -> Expr{cons("ErrorFree")}
%%%
%% Class creation
%%%
sorts New ObjectCVar FullyQualifiedClassName
context-free syntax
'new' ClassNameReference "(" {CallParam ","}* ")" -> New {cons("ObjectCreation")}
'new' ClassNameReference -> New {cons("ObjectCreation")}
Expr -> CallParam {cons("Param")}
"&"Expr -> CallParam {cons("RefParam")}
New -> Expr
%%%
%% Class names
%%%
context-free syntax
String -> ClassNameReference {cons("ClassName")}
DynamicClassNameReference -> ClassNameReference
ObjectCVar -> DynamicClassNameReference
String -> FullyQualifiedClassName {cons("ClassName")}
%% Special function to Expr. Need a prefer to solve ambigutie
%% Can not be done by precedende right now
sorts Print InternalFunction Exit
context-free syntax
InternalFunction -> Expr {prefer,cons("InternalFunction")}