%% %% 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{prefer,cons("ErrorFree")} %%% %% Class creation %%% sorts New ObjectCVar FullyQualifiedClassName ClassNameReference DynamicClassNameReference 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")} sorts InternalFunction context-free syntax InternalFunction -> Expr {cons("InternalFunction")}