aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/parser
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-03-20 22:40:07 +0100
committerLars Knoll <lars.knoll@qt.io>2018-04-26 21:37:48 +0000
commit1b30e8f94cc15352583e8e1f27139676683f62af (patch)
treef149be122d7e31d915f718a65ae7e9fb01f751b5 /src/qml/parser
parent09cd6f8020b7c25eaaf959a48c452b01aebcf627 (diff)
Implement support for the ** and **= operators
Change-Id: I58a21e70fdd040175b52465d6ba52e7fceaf6398 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/parser')
-rw-r--r--src/qml/parser/qqmljs.g18
-rw-r--r--src/qml/parser/qqmljsast_p.h2
-rw-r--r--src/qml/parser/qqmljslexer.cpp4
3 files changed, 22 insertions, 2 deletions
diff --git a/src/qml/parser/qqmljs.g b/src/qml/parser/qqmljs.g
index 7defdb8a08..6ee4fe2b18 100644
--- a/src/qml/parser/qqmljs.g
+++ b/src/qml/parser/qqmljs.g
@@ -63,7 +63,8 @@
%token T_RBRACE "}" T_RBRACKET "]" T_REMAINDER "%"
%token T_REMAINDER_EQ "%=" T_RETURN "return" T_RPAREN ")"
%token T_SEMICOLON ";" T_AUTOMATIC_SEMICOLON T_STAR "*"
-%token T_STAR_STAR "**" T_STAR_EQ "*=" T_STRING_LITERAL "string literal"
+%token T_STAR_STAR "**" T_STAR_STAR_EQ "**=" T_STAR_EQ "*="
+%token T_STRING_LITERAL "string literal"
%token T_PROPERTY "property" T_SIGNAL "signal" T_READONLY "readonly"
%token T_SWITCH "switch" T_THIS "this" T_THROW "throw"
%token T_TILDE "~" T_TRY "try" T_TYPEOF "typeof"
@@ -2186,7 +2187,13 @@ UnaryExpression: T_NOT UnaryExpression;
ExponentiationExpression: UnaryExpression;
ExponentiationExpression: UpdateExpression T_STAR_STAR ExponentiationExpression;
-/. case $rule_number: { UNIMPLEMENTED; } ./
+/.
+ case $rule_number: {
+ AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression, QSOperator::Exp, sym(3).Expression);
+ node->operatorToken = loc(2);
+ sym(1).Node = node;
+ } break;
+./
MultiplicativeExpression: ExponentiationExpression;
@@ -2489,6 +2496,13 @@ AssignmentOperator: T_STAR_EQ;
} break;
./
+AssignmentOperator: T_STAR_STAR_EQ;
+/.
+ case $rule_number: {
+ sym(1).ival = QSOperator::InplaceExp;
+ } break;
+./
+
AssignmentOperator: T_DIVIDE_EQ;
/.
case $rule_number: {
diff --git a/src/qml/parser/qqmljsast_p.h b/src/qml/parser/qqmljsast_p.h
index cd5c3a1021..6992985097 100644
--- a/src/qml/parser/qqmljsast_p.h
+++ b/src/qml/parser/qqmljsast_p.h
@@ -77,6 +77,8 @@ enum Op {
Div,
InplaceDiv,
Equal,
+ Exp,
+ InplaceExp,
Ge,
Gt,
In,
diff --git a/src/qml/parser/qqmljslexer.cpp b/src/qml/parser/qqmljslexer.cpp
index 1165183483..1617f3dfa5 100644
--- a/src/qml/parser/qqmljslexer.cpp
+++ b/src/qml/parser/qqmljslexer.cpp
@@ -661,6 +661,10 @@ again:
return T_STAR_EQ;
} else if (_char == QLatin1Char('*')) {
scanChar();
+ if (_char == QLatin1Char('=')) {
+ scanChar();
+ return T_STAR_STAR_EQ;
+ }
return T_STAR_STAR;
}
return T_STAR;