Skip to content

Commit

Permalink
PHP8.1 Support (DOM&Compiler parser) - #149
Browse files Browse the repository at this point in the history
 * intersection type
  • Loading branch information
zulus committed May 3, 2023
1 parent 0f18a74 commit 54d5fe9
Show file tree
Hide file tree
Showing 5 changed files with 365 additions and 123 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -747,6 +747,15 @@ NOWDOC_CHARS=([^\n\r]|({NEWLINE}{TABS_AND_SPACES})+[^a-zA-Z_\u0080-\uffff\n\r \t
return createSymbol(ParserConstants.T_SR);
}

<ST_IN_SCRIPTING>("&"){WHITESPACES}?("$"|"...") {
yypushback(yylength() - 1);
return createSymbol(ParserConstants.T_REFERENCE_FOLLOWED_BY_VAR_OR_VARARG);
}

<ST_IN_SCRIPTING>"&" {
return createSymbol(ParserConstants.T_REFERENCE);
}

<ST_IN_SCRIPTING>"..." {
return createSymbol(ParserConstants.T_ELLIPSIS);
}
Expand Down Expand Up @@ -775,7 +784,6 @@ NOWDOC_CHARS=([^\n\r]|({NEWLINE}{TABS_AND_SPACES})+[^a-zA-Z_\u0080-\uffff\n\r \t
")" {return createSymbol(ParserConstants.T_CLOSE_PARENTHESE);}
"|" {return createSymbol(ParserConstants.T_OR);}
"^" {return createSymbol(ParserConstants.T_KOVA);}
"&" {return createSymbol(ParserConstants.T_REFERENCE);}
"+" {return createSymbol(ParserConstants.T_PLUS);}
"-" {return createSymbol(ParserConstants.T_MINUS);}
"/" {return createSymbol(ParserConstants.T_DIV);}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,7 @@ terminal String T_NAME_RELATIVE;
//php 8.1
terminal String T_READONLY;
terminal String T_ENUM;
terminal T_REFERENCE_FOLLOWED_BY_VAR_OR_VARARG;

/* Non terminals */

Expand Down Expand Up @@ -408,6 +409,13 @@ non terminal Integer property_modifier;
non terminal List<Integer> non_empty_property_modifiers;
non terminal Identifier enum_backing_type;
non terminal Expression enum_case_expr;
non terminal DNFType intersection_type;
non terminal DNFType intersection_type_without_static;
non terminal List<Identifier> intersection_type_list;
non terminal List<Identifier> intersection_type_list_without_static;
non terminal Boolean reference;
non terminal Boolean returns_ref;
non terminal Boolean is_variadic;


precedence left T_THROW;
Expand All @@ -424,7 +432,7 @@ precedence left T_BOOLEAN_OR;
precedence left T_BOOLEAN_AND;
precedence left T_OR;
precedence left T_KOVA;
precedence left T_REFERENCE;
precedence left T_REFERENCE, T_REFERENCE_FOLLOWED_BY_VAR_OR_VARARG;
precedence left T_ELLIPSIS;
precedence right T_YIELD;
precedence right T_DOUBLE_ARROW;
Expand Down Expand Up @@ -747,6 +755,17 @@ reserved_non_modifiers:v
:}
;

reference ::=
T_REFERENCE:ref
{:
RESULT = Boolean.TRUE;
:}
| T_REFERENCE_FOLLOWED_BY_VAR_OR_VARARG:ref
{:
RESULT = Boolean.TRUE;
:}
;

identifier ::=
string_st:v
{:
Expand Down Expand Up @@ -1472,8 +1491,29 @@ is_reference ::=
{:
RESULT = Boolean.FALSE;
:}
| T_REFERENCE_FOLLOWED_BY_VAR_OR_VARARG
{:
RESULT = Boolean.TRUE;
:}
;

| T_REFERENCE
is_variadic ::=
/* empty */
{:
RESULT = Boolean.FALSE;
:}
| T_ELLIPSIS
{:
RESULT = Boolean.TRUE;
:}
;

returns_ref ::=
/* empty */
{:
RESULT = Boolean.FALSE;
:}
| reference
{:
RESULT = Boolean.TRUE;
:}
Expand All @@ -1491,7 +1531,7 @@ string_st:functionName
;

unticked_function_declaration_statement ::=
T_FUNCTION:s is_reference:isReference function_name:fn
T_FUNCTION:s returns_ref:isReference function_name:fn
T_OPEN_PARENTHESE parameter_list:paramList T_CLOSE_PARENTHESE return_type:returnType
T_CURLY_OPEN:blockStart inner_statement_list:sList T_CURLY_CLOSE:blockEnd
{:
Expand Down Expand Up @@ -1648,7 +1688,7 @@ variable:var
RESULT = var;
:}

| T_REFERENCE:s variable:var
| reference:s variable:var
{:
RESULT = new Reference (sleft, varright, parser.ast, var);
:}
Expand Down Expand Up @@ -2018,56 +2058,46 @@ T_PUBLIC:value
;

parameter ::=
optional_property_modifiers:modifier optional_type_without_static:type T_VARIABLE:var
{:
int s = type == null ? varleft : typeleft;
s = modifier != 0 ? modifierleft : s;
Variable v = new Variable(varleft, varright, parser.ast, var);
RESULT = new FormalParameter(s, varright, parser.ast, type, v, null, false, modifier);
:}

| optional_property_modifiers:modifier optional_type_without_static:type T_ELLIPSIS:e T_VARIABLE:var
{:
int s = type == null ? eleft : typeleft;
s = modifier != 0 ? modifierleft : s;
Variable v = new Variable(varleft, varright, parser.ast, var);
RESULT = new FormalParameter(s, varright, parser.ast, type, v, null, true, modifier);
:}

| optional_property_modifiers:modifier optional_type_without_static:type T_REFERENCE:ref T_VARIABLE:var
{:
int s = type == null ? refleft : typeleft;
s = modifier != 0 ? modifierleft : s;
Variable v = new Variable(varleft, varright, parser.ast, var);
Reference ref_var = new Reference (refleft, varright, parser.ast, v);
RESULT = new FormalParameter(s, varright, parser.ast, type, ref_var, null, false, modifier);
:}

| optional_property_modifiers:modifier optional_type_without_static:type T_REFERENCE:ref T_ELLIPSIS T_VARIABLE:var
{:
int s = type == null ? refleft : typeleft;
s = modifier != 0 ? modifierleft : s;
Variable v = new Variable(varleft, varright, parser.ast, var);
Reference ref_var = new Reference (refleft, varright, parser.ast, v);
RESULT = new FormalParameter(s, varright, parser.ast, type, ref_var, null, true, modifier);
optional_property_modifiers:modifier optional_type_without_static:type is_reference:ref is_variadic:e T_VARIABLE:var
{:
int s = varleft;
if (modifier != 0) {
s = modifierleft;
} else if(type != null) {
s = typeleft;
} else if (ref) {
s = refleft;
} else if (e) {
s = eleft;
}

Expression v = new Variable(varleft, varright, parser.ast, var);
if (ref) {
v= new Reference (refleft, varright, parser.ast, (VariableBase)v);
}
RESULT = new FormalParameter(s, varright, parser.ast, type, v, null, e, modifier);

:}

| optional_property_modifiers:modifier optional_type_without_static:type T_VARIABLE:var T_EQUAL expr:expr
| optional_property_modifiers:modifier optional_type_without_static:type is_reference:ref is_variadic:e T_VARIABLE:var T_EQUAL expr:expr
{:
int s = type == null ? varleft : typeleft;
s = modifier != 0 ? modifierleft : s;
Variable v = new Variable(varleft, varright, parser.ast, var);
int s = varleft;
if (modifier != 0) {
s = modifierleft;
} else if(type != null) {
s = typeleft;
} else if (ref) {
s = refleft;
} else if (e) {
s = eleft;
}

Expression v = new Variable(varleft, varright, parser.ast, var);
if (ref) {
v= new Reference (refleft, varright, parser.ast, (VariableBase)v);
}
RESULT = new FormalParameter(s, exprright, parser.ast, type, v, expr, false, modifier);
:}

| optional_property_modifiers:modifier optional_type_without_static:type T_REFERENCE:ref T_VARIABLE:var T_EQUAL expr:expr
{:
int s = type == null ? refleft : typeleft;
s = modifier != 0 ? modifierleft : s;
Variable v = new Variable(varleft, varright, parser.ast, var);
Reference ref_var = new Reference (refleft, varright, parser.ast, v);
RESULT = new FormalParameter(s, exprright, parser.ast, type, ref_var, expr, false, modifier);
:}
;

optional_type_without_static ::=
Expand Down Expand Up @@ -2143,6 +2173,10 @@ type:type
{:
RESULT = type;
:}
| intersection_type:type
{:
RESULT = type;
:}
;

type ::=
Expand Down Expand Up @@ -2180,6 +2214,29 @@ type:first T_OR type:second
:}
;

intersection_type ::=
intersection_type_list:list
{:
RESULT = new DNFType(listleft, listright, parser.ast, false, list, DNFType.T_INTERSECTION);
:}
;

intersection_type_list ::=
type:first T_REFERENCE type:second
{:
List<Identifier> refs = new LinkedList<>();
refs.add(first);
refs.add(second);
RESULT = refs;
:}
| intersection_type_list:list T_REFERENCE type:type
{:
list.add(type);

RESULT = list;
:}
;


type_expr_without_static ::=
type_without_static:type
Expand All @@ -2196,6 +2253,10 @@ type_without_static:type
{:
RESULT = type;
:}
| intersection_type_without_static:type
{:
RESULT = type;
:}
;


Expand Down Expand Up @@ -2239,6 +2300,30 @@ type_without_static:first T_OR type_without_static:second
:}
;

intersection_type_without_static ::=
intersection_type_list_without_static:list
{:
RESULT = new DNFType(listleft, listright, parser.ast, false, list, DNFType.T_INTERSECTION);
:}
;

intersection_type_list_without_static ::=
type_without_static:first T_REFERENCE type_without_static:second
{:
List<Identifier> refs = new LinkedList<>();
refs.add(first);
refs.add(second);
RESULT = refs;
:}
| intersection_type_list_without_static:list T_REFERENCE type_without_static:type
{:
list.add(type);

RESULT = list;
:}
;


return_type ::=
/* empty */
{:
Expand Down Expand Up @@ -2334,7 +2419,7 @@ variable_modifiers:modifier optional_type_without_static:type property_list:decL
int modifierValue = modifier == null ? 0 : modifier.intValue();
RESULT = new ConstantDeclaration(methodStart, eright, parser.ast, modifierValue, list);
:}
| method_modifiers:modifier T_FUNCTION:s is_reference:isReference identifier:fn
| method_modifiers:modifier T_FUNCTION:s returns_ref:isReference identifier:fn
T_OPEN_PARENTHESE parameter_list:paramList T_CLOSE_PARENTHESE return_type:returnType
method_body:body
{:
Expand Down Expand Up @@ -2781,7 +2866,7 @@ T_LIST:s T_OPEN_PARENTHESE assignment_list:varList T_CLOSE_PARENTHESE:close T_EQ
RESULT = new Assignment(varleft, exprright, parser.ast, var, Assignment.OP_EQUAL, expr);
:}

| variable:var T_EQUAL T_REFERENCE:reftoken variable:refvar
| variable:var T_EQUAL reference:reftoken variable:refvar
{:
RESULT = new Assignment(varleft, refvarright, parser.ast, var, Assignment.OP_EQUAL, new Reference(reftokenleft, refvarright, parser.ast, refvar));
:}
Expand Down Expand Up @@ -3160,31 +3245,31 @@ T_LIST:s T_OPEN_PARENTHESE assignment_list:varList T_CLOSE_PARENTHESE:close T_EQ
;

inline_function ::=
T_FUNCTION:s is_reference:isReference
T_FUNCTION:s returns_ref:isReference
T_OPEN_PARENTHESE parameter_list:paramList T_CLOSE_PARENTHESE lexical_vars:varsList return_type:returnType
T_CURLY_OPEN:blockStart inner_statement_list:list T_CURLY_CLOSE:blockEnd
{:
RESULT = new LambdaFunctionDeclaration(sleft, blockEndright, parser.ast, paramList, varsList,
new Block(blockStartleft, blockEndright, parser.ast, list), isReference.booleanValue(), false, -1, returnType);
:}

| T_STATIC:modifier T_FUNCTION:s is_reference:isReference
| T_STATIC:modifier T_FUNCTION:s returns_ref:isReference
T_OPEN_PARENTHESE parameter_list:paramList T_CLOSE_PARENTHESE lexical_vars:varsList return_type:returnType
T_CURLY_OPEN:blockStart inner_statement_list:list T_CURLY_CLOSE:blockEnd
{:
RESULT = new LambdaFunctionDeclaration(modifierleft, blockEndright, parser.ast, paramList, varsList,
new Block(blockStartleft, blockEndright, parser.ast, list), isReference.booleanValue(), true, returnType);
:}

| T_FN:s is_reference:isReference
| T_FN:s returns_ref:isReference
T_OPEN_PARENTHESE parameter_list:paramList T_CLOSE_PARENTHESE return_type:returnType
T_DOUBLE_ARROW expr:expr
{:
RESULT = new ArrowFunctionDeclaration(sleft, exprright, parser.ast, paramList,
expr, isReference.booleanValue(), false, returnType);
:}

| T_STATIC:modifier T_FN:s is_reference:isReference
| T_STATIC:modifier T_FN:s returns_ref:isReference
T_OPEN_PARENTHESE parameter_list:paramList T_CLOSE_PARENTHESE return_type:returnType
T_DOUBLE_ARROW expr:expr
{:
Expand Down Expand Up @@ -3229,7 +3314,7 @@ T_VARIABLE:var
RESULT = new Variable(varleft, varright, parser.ast, var);
:}

| T_REFERENCE:ref T_VARIABLE:var
| reference:ref T_VARIABLE:var
{:
RESULT = new Reference(refleft, varright, parser.ast, new Variable(varleft, varright, parser.ast, var));
:}
Expand Down Expand Up @@ -3781,12 +3866,12 @@ expr:key T_DOUBLE_ARROW expr:value
RESULT = expr;
:}

| expr:key T_DOUBLE_ARROW T_REFERENCE:s variable:var
| expr:key T_DOUBLE_ARROW reference:s variable:var
{:
RESULT = new ArrayElement(keyleft, varright, parser.ast, key, new Reference(sleft, varright, parser.ast, var));
:}

| T_REFERENCE:s variable:var
| reference:s variable:var
{:
RESULT = new Reference(sleft, varright, parser.ast, var);
:}
Expand Down

0 comments on commit 54d5fe9

Please sign in to comment.