@@ -257,7 +257,7 @@ extern int yylex();
257
257
%token <str> tknConstCast tknStaticCast tknDynamicCast tknReinterpretCast
258
258
%token <str> tknTry tknCatch tknThrow tknSizeOf
259
259
%token <str> tknOperator tknPlusEq tknMinusEq tknMulEq tknDivEq tknPerEq tknXorEq tknAndEq tknOrEq
260
- %token <str> tknLShift /* tknRShift*/ tknLShiftEq tknRShiftEq tknCmpEq tknNotEq tknLessEq tknGreaterEq
260
+ %token <str> tknLShift tknRShift tknLShiftEq tknRShiftEq tknCmpEq tknNotEq tknLessEq tknGreaterEq
261
261
%token <str> tkn3WayCmp tknAnd tknOr tknInc tknDec tknArrow tknArrowStar
262
262
%token <str> tknLT tknGT // We will need the position of these operators in stream when used for declaring template instance .
263
263
%token <str> ' +' ' -' ' *' ' /' ' %' ' ^' ' &' ' |' ' ~' ' !' ' =' ' ,' ' (' ' )' ' [' ' ]' ' ;'
@@ -365,9 +365,9 @@ extern int yylex();
365
365
%left ' &'
366
366
%left tknCmpEq tknNotEq // ==, !=
367
367
// tknLT and tknGT are used instead of '<', and '> ' because otherwise parsing template and template args is very difficult.
368
- %left tknLT /* tknGT*/ tknLessEq tknGreaterEq GTPREC
368
+ %left tknLT tknGT tknLessEq tknGreaterEq
369
369
%left tkn3WayCmp // <=>
370
- %left tknLShift RSHIFT
370
+ %left tknLShift tknRShift RSHIFT
371
371
372
372
%left ' +' ' -'
373
373
%left ' *' ' /' ' %'
@@ -713,10 +713,18 @@ typeidentifier : identifier [ZZLOG;] { $$ = $1; }
713
713
| tknDecltype '(' expr ')' [ZZLOG;] { $$ = mergeCppToken($1, $4); delete $3; }
714
714
;
715
715
716
- templidentifier : identifier tknLT templatearglist tknGT [ZZLOG ; $$ = mergeCppToken($1, $4); ] {}
716
+ templidentifier : identifier tknLT templatearglist tknGT [ZZLOG ; $$ = mergeCppToken($1, $4); ] {}
717
+ // The following rule is needed to parse an ambiguous input as template identifier,
718
+ // see the test "vardecl-or-expr-ambiguity".
719
+ | identifier tknLT expr tknNotEq expr tknGT [ZZLOG; $$ = mergeCppToken($1, $6); ] {}
720
+ // The following rule is needed to parse a template identifier which otherwise fails to parse
721
+ // because of higher precedence of tknLT and tknGT,
722
+ // see the test "C<Class, v != 0> x;".
723
+ | identifier tknLT templatearglist ',' expr tknNotEq expr tknGT
724
+ [ZZLOG; $$ = mergeCppToken($1, $8); ] {}
717
725
;
718
726
719
- templqualifiedid : tknTemplate templidentifier [ZZLOG ; $$ = mergeCppToken($1, $2); ] {}
727
+ templqualifiedid : tknTemplate templidentifier [ZZLOG ; $$ = mergeCppToken($1, $2); ] {}
720
728
;
721
729
722
730
name : tknName [ZZLOG ; $$ = $1;] {}
@@ -856,13 +864,11 @@ vardeclstmt : vardecl ';' [ZZVALID;] { $$ = $1; }
856
864
857
865
vardecllist : optfunctype varinit ' ,' opttypemodifier name optvarassign [ZZLOG ;] {
858
866
$2->addAttr($1);
859
- $$ = new CppVarList($2, CppVarDeclInList($4, CppVarDecl{$5}));
860
- /* TODO: Use optvarassign as well */
867
+ $$ = new CppVarList($2, CppVarDeclInList($4, CppVarDecl{$5, $6.assignValue_, $6.assignType_}));
861
868
}
862
869
| optfunctype vardecl ',' opttypemodifier name optvarassign [ZZLOG;] {
863
870
$2->addAttr($1);
864
- $$ = new CppVarList($2, CppVarDeclInList($4, CppVarDecl{$5}));
865
- /* TODO: Use optvarassign as well */
871
+ $$ = new CppVarList($2, CppVarDeclInList($4, CppVarDecl{$5, $6.assignValue_, $6.assignType_}));
866
872
}
867
873
| optfunctype vardecl ',' opttypemodifier name '[' expr ']' [ZZLOG;] {
868
874
$2->addAttr($1);
@@ -878,8 +884,7 @@ vardecllist : optfunctype varinit ',' opttypemodifier name optvarassign [Z
878
884
}
879
885
| vardecllist ',' opttypemodifier name optvarassign [ZZLOG;] {
880
886
$$ = $1;
881
- $$->addVarDecl(CppVarDeclInList($3, CppVarDecl{$4}));
882
- /* TODO: Use optvarassign as well */
887
+ $$->addVarDecl(CppVarDeclInList($3, CppVarDecl{$4, $5.assignValue_, $5.assignType_}));
883
888
}
884
889
| vardecllist ',' opttypemodifier name optvarassign ':' expr [ZZLOG;] {
885
890
$$ = $1;
@@ -1266,7 +1271,7 @@ operfuncname : tknOperator '+' [ZZLOG;] { $$ = mergeCppToken(
1266
1271
| tknOperator tknAndEq [ZZLOG;] { $$ = mergeCppToken($1, $2); }
1267
1272
| tknOperator tknOrEq [ZZLOG;] { $$ = mergeCppToken($1, $2); }
1268
1273
| tknOperator tknLShift [ZZLOG;] { $$ = mergeCppToken($1, $2); }
1269
- | tknOperator rshift [ZZLOG;] { $$ = mergeCppToken($1, $2); }
1274
+ | tknOperator tknRShift [ZZLOG;] { $$ = mergeCppToken($1, $2); }
1270
1275
| tknOperator tknLShiftEq [ZZLOG;] { $$ = mergeCppToken($1, $2); }
1271
1276
| tknOperator tknRShiftEq [ZZLOG;] { $$ = mergeCppToken($1, $2); }
1272
1277
| tknOperator tknCmpEq [ZZLOG;] { $$ = mergeCppToken($1, $2); }
@@ -1343,10 +1348,10 @@ param : varinit [ZZLOG;] { $$ = $1; $1->addAt
1343
1348
templatearg : [ZZLOG ; $$ = nullptr;] { /* $$ = makeCppToken(nullptr, nullptr);*/ }
1344
1349
| vartype [ZZLOG; $$ = nullptr;] { /* $$ = mergeCppToken($1, $2);*/ }
1345
1350
| funcobjstr [ZZLOG; $$ = nullptr;] { /* $$ = $1;*/ }
1346
- | expr [ZZLOG; $$ = nullptr; ] {}
1351
+ | expr [ZZLOG; $$ = nullptr;] {}
1347
1352
;
1348
1353
1349
- templatearglist : templatearg [ZZLOG ; $$ = $1; ] {}
1354
+ templatearglist : templatearg [ZZLOG ; $$ = $1; ] {}
1350
1355
| templatearglist ',' templatearg [ZZLOG; $$ = $1;] { /* $$ = mergeCppToken($1, $3);*/ }
1351
1356
| templatearglist ',' doccomment templatearg [ZZLOG; $$ = $1;] { /* $$ = mergeCppToken($1, $3);*/ }
1352
1357
;
@@ -1756,14 +1761,14 @@ templateparam : tknTypename optname [ZZLOG;] {
1756
1761
| vartype name [ZZLOG;] {
1757
1762
$$ = new CppTemplateParam($1, $2);
1758
1763
}
1759
- | vartype name '=' expr [ZZLOG;] {
1764
+ | vartype name '=' expr %prec TEMPLATE [ZZLOG;] {
1760
1765
$$ = new CppTemplateParam($1, $2);
1761
1766
$$->defaultArg($4);
1762
1767
}
1763
1768
| functionpointer [ZZLOG;] {
1764
1769
$$ = new CppTemplateParam($1, std::string());
1765
1770
}
1766
- | functionpointer '=' expr [ZZLOG;] {
1771
+ | functionpointer '=' expr %prec TEMPLATE [ZZLOG;] {
1767
1772
$$ = new CppTemplateParam($1, std::string());
1768
1773
$$->defaultArg($3);
1769
1774
}
@@ -1884,7 +1889,7 @@ expr : strlit [ZZLOG
1884
1889
| expr '^' expr [ZZLOG;] { $$ = new CppExpr($1, kXor, $3); }
1885
1890
| expr '=' expr [ZZLOG;] { $$ = new CppExpr($1, kEqual, $3); }
1886
1891
| expr tknLT expr [ZZLOG;] { $$ = new CppExpr($1, kLess, $3); }
1887
- | expr tknGT expr %prec GTPREC [ZZLOG;] { $$ = new CppExpr($1, kGreater, $3); }
1892
+ | expr tknGT expr [ZZLOG;] { $$ = new CppExpr($1, kGreater, $3); }
1888
1893
| expr '?' expr ':' expr %prec TERNARYCOND [ZZLOG;] { $$ = new CppExpr($1, $3, $5); }
1889
1894
| expr tknPlusEq expr [ZZLOG;] { $$ = new CppExpr($1, kPlusEqual, $3); }
1890
1895
| expr tknMinusEq expr [ZZLOG;] { $$ = new CppExpr($1, kMinusEqual, $3); }
@@ -2079,8 +2084,8 @@ void yyerror_detailed ( char* text,
2079
2084
2080
2085
enum {
2081
2086
kNoLog = 0x000 ,
2082
- kParseLog = 0x001 ,
2083
- kLexLog = 0x002 ,
2087
+ kLexLog = 0x001 ,
2088
+ kParseLog = 0x002 ,
2084
2089
kYaccLog = 0x004
2085
2090
};
2086
2091
0 commit comments