Changeset e86735ba


Ignore:
Timestamp:
Apr 18, 2025, 4:15:39 PM (4 weeks ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
master
Children:
0eacfd4
Parents:
9dd1dd6
Message:

clean up current for control, first attempt at adding ==/!= to for control

Location:
src/Parser
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/lex.ll

    r9dd1dd6 re86735ba  
    1010 * Created On       : Sat Sep 22 08:58:10 2001
    1111 * Last Modified By : Peter A. Buhr
    12  * Last Modified On : Mon Mar  3 09:21:33 2025
    13  * Update Count     : 880
     12 * Last Modified On : Fri Apr 18 15:23:40 2025
     13 * Update Count     : 884
    1414 */
    1515
     
    474474
    475475"@="                    { NAMEDOP_RETURN(ATassign); }                   // CFA
    476 "+~"                    { NAMEDOP_RETURN(ErangeUp); }                   // CFA
    477 "~="                    { NAMEDOP_RETURN(ErangeUpEq); }                 // CFA
    478 "+~="                   { NAMEDOP_RETURN(ErangeUpEq); }                 // CFA
    479 "-~"                    { NAMEDOP_RETURN(ErangeDown); }                 // CFA
    480 "-~="                   { NAMEDOP_RETURN(ErangeDownEq); }               // CFA
     476"+~"                    { NAMEDOP_RETURN(ErangeUpLt); }                 // CFA
     477"~="                    { NAMEDOP_RETURN(ErangeUpLe); }                 // CFA
     478"+~="                   { NAMEDOP_RETURN(ErangeUpLe); }                 // CFA
     479"-~"                    { NAMEDOP_RETURN(ErangeDownGt); }               // CFA
     480"-~="                   { NAMEDOP_RETURN(ErangeDownGe); }               // CFA
     481"~=="                   { NAMEDOP_RETURN(ErangeEq); }                   // CFA
     482"~!="                   { NAMEDOP_RETURN(ErangeNe); }                   // CFA
     483"-~=="                  { NAMEDOP_RETURN(ErangeDownEq); }               // CFA
     484"-~!="                  { NAMEDOP_RETURN(ErangeDownNe); }               // CFA
    481485
    482486                                /* CFA, operator identifier */
  • src/Parser/parser.yy

    r9dd1dd6 re86735ba  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Apr  8 18:36:20 2025
    13 // Update Count     : 7259
     12// Last Modified On : Fri Apr 18 15:23:42 2025
     13// Update Count     : 7283
    1414//
    1515
     
    229229#define NEW_ZERO new ExpressionNode( build_constantInteger( yylloc, *new string( "0" ) ) )
    230230#define NEW_ONE  new ExpressionNode( build_constantInteger( yylloc, *new string( "1" ) ) )
    231 #define UPDOWN( compop, left, right ) (compop == OperKinds::LThan || compop == OperKinds::LEThan ? left : right)
     231#define UPDOWN( compop, left, right ) (compop == OperKinds::LThan || compop == OperKinds::LEThan || compop == OperKinds::Neq ? left : right)
    232232#define MISSING_ANON_FIELD "illegal syntax, missing loop fields with an anonymous loop index is meaningless as loop index is unavailable in loop body."
    233233#define MISSING_LOW "illegal syntax, missing low value for ascanding range so index is uninitialized."
     
    242242        if ( inc ) inc = new ExpressionNode( build_binary_val( location,
    243243                // choose += or -= for upto/downto
    244                 compop == OperKinds::LThan || compop == OperKinds::LEThan ? OperKinds::PlusAssn : OperKinds::MinusAssn,
     244                UPDOWN( compop, OperKinds::PlusAssn, OperKinds::MinusAssn ),
    245245                new ExpressionNode( build_varref( location, new string( *init->name ) ) ),
    246246                inc ) );
     
    418418%token ANDassign        ERassign        ORassign                                // &=   ^=      |=
    419419
    420 %token ErangeUp         ErangeUpEq      ErangeDown      ErangeDownEq // +~      +~=/~=  -~      -~=
     420%token ErangeUpLt       ErangeUpLe      ErangeEq        ErangeNe        // +~ +~=/~= ~== ~!=
     421%token ErangeDownGt     ErangeDownGe    ErangeDownEq    ErangeDownNe // -~ -~= -~== -~!=
    421422%token ATassign                                                                                 // @=
    422423
     
    442443%type<ifctrl> conditional_declaration
    443444%type<forctrl> for_control_expression   for_control_expression_list
    444 %type<oper> upupeq updown updowneq downupdowneq
     445%type<oper> upupeq      updown  updownS updownEq
    445446%type<expr> subrange
    446447%type<decl> asm_name_opt
     
    14851486        | comma_expression                                                                      // CFA, anonymous loop-index
    14861487                { $$ = forCtrl( yylloc, $1, new string( DeclarationNode::anonymous.newName() ), NEW_ZERO, OperKinds::LThan, $1->clone(), NEW_ONE ); }
    1487         | downupdowneq comma_expression                                         // CFA, anonymous loop-index
     1488        | updown comma_expression                                                       // CFA, anonymous loop-index
    14881489                { $$ = forCtrl( yylloc, $2, new string( DeclarationNode::anonymous.newName() ), UPDOWN( $1, NEW_ZERO, $2->clone() ), $1, UPDOWN( $1, $2->clone(), NEW_ZERO ), NEW_ONE ); }
    14891490
    1490         | comma_expression updowneq comma_expression            // CFA, anonymous loop-index
     1491        | comma_expression updownS comma_expression                     // CFA, anonymous loop-index
    14911492                { $$ = forCtrl( yylloc, $1, new string( DeclarationNode::anonymous.newName() ), UPDOWN( $2, $1->clone(), $3 ), $2, UPDOWN( $2, $3->clone(), $1->clone() ), NEW_ONE ); }
    1492         | '@' updowneq comma_expression                                         // CFA, anonymous loop-index
     1493        | '@' updownS comma_expression                                          // CFA, anonymous loop-index
    14931494                {
    14941495                        if ( $2 == OperKinds::LThan || $2 == OperKinds::LEThan ) { SemanticError( yylloc, MISSING_LOW ); $$ = nullptr; }
    14951496                        else $$ = forCtrl( yylloc, $3, new string( DeclarationNode::anonymous.newName() ), $3->clone(), $2, nullptr, NEW_ONE );
    14961497                }
    1497         | comma_expression updowneq '@'                                         // CFA, anonymous loop-index
     1498        | comma_expression updownS '@'                                          // CFA, anonymous loop-index
    14981499                {
    14991500                        if ( $2 == OperKinds::LThan || $2 == OperKinds::LEThan ) { SemanticError( yylloc, MISSING_ANON_FIELD ); $$ = nullptr; }
    15001501                        else { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; }
    15011502                }
    1502         | comma_expression updowneq comma_expression '~' comma_expression // CFA, anonymous loop-index
     1503
     1504        | comma_expression updownS comma_expression '~' comma_expression // CFA, anonymous loop-index
    15031505                { $$ = forCtrl( yylloc, $1, new string( DeclarationNode::anonymous.newName() ), UPDOWN( $2, $1->clone(), $3 ), $2, UPDOWN( $2, $3->clone(), $1->clone() ), $5 ); }
    1504         | '@' updowneq comma_expression '~' comma_expression // CFA, anonymous loop-index
     1506        | '@' updownS comma_expression '~' comma_expression // CFA, anonymous loop-index
    15051507                {
    15061508                        if ( $2 == OperKinds::LThan || $2 == OperKinds::LEThan ) { SemanticError( yylloc, MISSING_LOW ); $$ = nullptr; }
    15071509                        else $$ = forCtrl( yylloc, $3, new string( DeclarationNode::anonymous.newName() ), $3->clone(), $2, nullptr, $5 );
    15081510                }
    1509         | comma_expression updowneq '@' '~' comma_expression // CFA, anonymous loop-index
     1511        | comma_expression updownS '@' '~' comma_expression // CFA, anonymous loop-index
    15101512                {
    15111513                        if ( $2 == OperKinds::LThan || $2 == OperKinds::LEThan ) { SemanticError( yylloc, MISSING_ANON_FIELD ); $$ = nullptr; }
    15121514                        else { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; }
    15131515                }
    1514         | comma_expression updowneq comma_expression '~' '@' // CFA, invalid syntax rule
     1516        | comma_expression updownS comma_expression '~' '@' // CFA, invalid syntax rule
    15151517                { SemanticError( yylloc, MISSING_ANON_FIELD ); $$ = nullptr; }
    1516         | '@' updowneq '@'                                                                      // CFA, invalid syntax rule
     1518        | '@' updownS '@'                                                                       // CFA, invalid syntax rule
    15171519                { SemanticError( yylloc, MISSING_ANON_FIELD ); $$ = nullptr; }
    1518         | '@' updowneq comma_expression '~' '@'                         // CFA, invalid syntax rule
     1520        | '@' updownS comma_expression '~' '@'                          // CFA, invalid syntax rule
    15191521                { SemanticError( yylloc, MISSING_ANON_FIELD ); $$ = nullptr; }
    1520         | comma_expression updowneq '@' '~' '@'                         // CFA, invalid syntax rule
     1522        | comma_expression updownS '@' '~' '@'                          // CFA, invalid syntax rule
    15211523                { SemanticError( yylloc, MISSING_ANON_FIELD ); $$ = nullptr; }
    1522         | '@' updowneq '@' '~' '@'                                                      // CFA, invalid syntax rule
     1524        | '@' updownS '@' '~' '@'                                                       // CFA, invalid syntax rule
    15231525                { SemanticError( yylloc, MISSING_ANON_FIELD ); $$ = nullptr; }
    15241526
     
    15271529        | comma_expression ';' comma_expression                         // CFA
    15281530                { $$ = forCtrl( yylloc, $3, $1, NEW_ZERO, OperKinds::LThan, $3->clone(), NEW_ONE ); }
    1529         | comma_expression ';' downupdowneq comma_expression // CFA
     1531        | comma_expression ';' updown comma_expression // CFA
    15301532                { $$ = forCtrl( yylloc, $4, $1, UPDOWN( $3, NEW_ZERO, $4->clone() ), $3, UPDOWN( $3, $4->clone(), NEW_ZERO ), NEW_ONE ); }
    15311533
    1532         | comma_expression ';' comma_expression updowneq comma_expression // CFA
     1534        | comma_expression ';' comma_expression updownS comma_expression // CFA
    15331535                { $$ = forCtrl( yylloc, $3, $1, UPDOWN( $4, $3->clone(), $5 ), $4, UPDOWN( $4, $5->clone(), $3->clone() ), NEW_ONE ); }
    1534         | comma_expression ';' '@' updowneq comma_expression // CFA
     1536        | comma_expression ';' '@' updownS comma_expression // CFA
    15351537                {
    15361538                        if ( $4 == OperKinds::LThan || $4 == OperKinds::LEThan ) { SemanticError( yylloc, MISSING_LOW ); $$ = nullptr; }
    15371539                        else $$ = forCtrl( yylloc, $5, $1, $5->clone(), $4, nullptr, NEW_ONE );
    15381540                }
    1539         | comma_expression ';' comma_expression updowneq '@' // CFA
     1541        | comma_expression ';' comma_expression updownS '@' // CFA
    15401542                {
    15411543                        if ( $4 == OperKinds::GThan || $4 == OperKinds::GEThan ) { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; }
     
    15431545                        else $$ = forCtrl( yylloc, $3, $1, $3->clone(), $4, nullptr, NEW_ONE );
    15441546                }
    1545         | comma_expression ';' '@' updowneq '@'                         // CFA, invalid syntax rule
     1547        | comma_expression ';' '@' updownS '@'                          // CFA, invalid syntax rule
    15461548                { SemanticError( yylloc, "illegal syntax, missing low/high value for ascending/descending range so index is uninitialized." ); $$ = nullptr; }
    15471549
    1548         | comma_expression ';' comma_expression updowneq comma_expression '~' comma_expression // CFA
     1550        | comma_expression ';' comma_expression updownEq comma_expression // CFA
     1551                { $$ = forCtrl( yylloc, $3, $1, UPDOWN( $4, $3->clone(), $5 ), $4, UPDOWN( $4, $5->clone(), $3->clone() ), NEW_ONE ); }
     1552
     1553        | comma_expression ';' comma_expression updownS comma_expression '~' comma_expression // CFA
    15491554                { $$ = forCtrl( yylloc, $3, $1, UPDOWN( $4, $3->clone(), $5 ), $4, UPDOWN( $4, $5->clone(), $3->clone() ), $7 ); }
    1550         | comma_expression ';' '@' updowneq comma_expression '~' comma_expression // CFA, invalid syntax rule
     1555        | comma_expression ';' '@' updownS comma_expression '~' comma_expression // CFA, invalid syntax rule
    15511556                {
    15521557                        if ( $4 == OperKinds::LThan || $4 == OperKinds::LEThan ) { SemanticError( yylloc, MISSING_LOW ); $$ = nullptr; }
    15531558                        else $$ = forCtrl( yylloc, $5, $1, $5->clone(), $4, nullptr, $7 );
    15541559                }
    1555         | comma_expression ';' comma_expression updowneq '@' '~' comma_expression // CFA
     1560        | comma_expression ';' comma_expression updownS '@' '~' comma_expression // CFA
    15561561                {
    15571562                        if ( $4 == OperKinds::GThan || $4 == OperKinds::GEThan ) { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; }
     
    15591564                        else $$ = forCtrl( yylloc, $3, $1, $3->clone(), $4, nullptr, $7 );
    15601565                }
    1561         | comma_expression ';' comma_expression updowneq comma_expression '~' '@' // CFA
     1566        | comma_expression ';' comma_expression updownS comma_expression '~' '@' // CFA
    15621567                { $$ = forCtrl( yylloc, $3, $1, UPDOWN( $4, $3->clone(), $5 ), $4, UPDOWN( $4, $5->clone(), $3->clone() ), nullptr ); }
    1563         | comma_expression ';' '@' updowneq comma_expression '~' '@' // CFA, invalid syntax rule
     1568        | comma_expression ';' '@' updownS comma_expression '~' '@' // CFA, invalid syntax rule
    15641569                {
    15651570                        if ( $4 == OperKinds::LThan || $4 == OperKinds::LEThan ) { SemanticError( yylloc, MISSING_LOW ); $$ = nullptr; }
    15661571                        else $$ = forCtrl( yylloc, $5, $1, $5->clone(), $4, nullptr, nullptr );
    15671572                }
    1568         | comma_expression ';' comma_expression updowneq '@' '~' '@' // CFA
     1573        | comma_expression ';' comma_expression updownS '@' '~' '@' // CFA
    15691574                {
    15701575                        if ( $4 == OperKinds::GThan || $4 == OperKinds::GEThan ) { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; }
     
    15721577                        else $$ = forCtrl( yylloc, $3, $1, $3->clone(), $4, nullptr, nullptr );
    15731578                }
    1574         | comma_expression ';' '@' updowneq '@' '~' '@' // CFA
     1579        | comma_expression ';' '@' updownS '@' '~' '@'          // CFA
    15751580                { SemanticError( yylloc, "illegal syntax, missing low/high value for ascending/descending range so index is uninitialized." ); $$ = nullptr; }
    15761581
    1577 //      | '@' identifier ';' comma_expression                   // CFA
    15781582        | declaration comma_expression                                          // CFA
    15791583                { $$ = forCtrl( yylloc, $1, NEW_ZERO, OperKinds::LThan, $2, NEW_ONE ); }
    1580         | declaration downupdowneq comma_expression                     // CFA
     1584        | declaration updown comma_expression                           // CFA
    15811585                { $$ = forCtrl( yylloc, $1, UPDOWN( $2, NEW_ZERO, $3 ), $2, UPDOWN( $2, $3->clone(), NEW_ZERO ), NEW_ONE ); }
    15821586
    1583         | declaration comma_expression updowneq comma_expression // CFA
     1587        | declaration comma_expression updownS comma_expression // CFA
    15841588                { $$ = forCtrl( yylloc, $1, UPDOWN( $3, $2->clone(), $4 ), $3, UPDOWN( $3, $4->clone(), $2->clone() ), NEW_ONE ); }
    1585         | declaration '@' updowneq comma_expression                     // CFA
     1589        | declaration '@' updownS comma_expression                      // CFA
    15861590                {
    15871591                        if ( $3 == OperKinds::LThan || $3 == OperKinds::LEThan ) { SemanticError( yylloc, MISSING_LOW ); $$ = nullptr; }
    15881592                        else $$ = forCtrl( yylloc, $1, $4, $3, nullptr, NEW_ONE );
    15891593                }
    1590         | declaration comma_expression updowneq '@'                     // CFA
     1594        | declaration comma_expression updownS '@'                      // CFA
    15911595                {
    15921596                        if ( $3 == OperKinds::GThan || $3 == OperKinds::GEThan ) { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; }
     
    15951599                }
    15961600
    1597         | declaration comma_expression updowneq comma_expression '~' comma_expression // CFA
     1601        | declaration comma_expression updownEq comma_expression // CFA
     1602                { $$ = forCtrl( yylloc, $1, UPDOWN( $3, $2->clone(), $4 ), $3, UPDOWN( $3, $4->clone(), $2->clone() ), NEW_ONE ); }
     1603
     1604        | declaration comma_expression updownS comma_expression '~' comma_expression // CFA
    15981605                { $$ = forCtrl( yylloc, $1, UPDOWN( $3, $2, $4 ), $3, UPDOWN( $3, $4->clone(), $2->clone() ), $6 ); }
    1599         | declaration '@' updowneq comma_expression '~' comma_expression // CFA
     1606        | declaration '@' updownS comma_expression '~' comma_expression // CFA
    16001607                {
    16011608                        if ( $3 == OperKinds::LThan || $3 == OperKinds::LEThan ) { SemanticError( yylloc, MISSING_LOW ); $$ = nullptr; }
    16021609                        else $$ = forCtrl( yylloc, $1, $4, $3, nullptr, $6 );
    16031610                }
    1604         | declaration comma_expression updowneq '@' '~' comma_expression // CFA
     1611        | declaration comma_expression updownS '@' '~' comma_expression // CFA
    16051612                {
    16061613                        if ( $3 == OperKinds::GThan || $3 == OperKinds::GEThan ) { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; }
     
    16081615                        else $$ = forCtrl( yylloc, $1, $2, $3, nullptr, $6 );
    16091616                }
    1610         | declaration comma_expression updowneq comma_expression '~' '@' // CFA
     1617        | declaration comma_expression updownS comma_expression '~' '@' // CFA
    16111618                { $$ = forCtrl( yylloc, $1, UPDOWN( $3, $2, $4 ), $3, UPDOWN( $3, $4->clone(), $2->clone() ), nullptr ); }
    1612         | declaration '@' updowneq comma_expression '~' '@' // CFA
     1619        | declaration '@' updownS comma_expression '~' '@'      // CFA
    16131620                {
    16141621                        if ( $3 == OperKinds::LThan || $3 == OperKinds::LEThan ) { SemanticError( yylloc, MISSING_LOW ); $$ = nullptr; }
    16151622                        else $$ = forCtrl( yylloc, $1, $4, $3, nullptr, nullptr );
    16161623                }
    1617         | declaration comma_expression updowneq '@' '~' '@'     // CFA
     1624        | declaration comma_expression updownS '@' '~' '@'      // CFA
    16181625                {
    16191626                        if ( $3 == OperKinds::GThan || $3 == OperKinds::GEThan ) { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; }
     
    16211628                        else $$ = forCtrl( yylloc, $1, $2, $3, nullptr, nullptr );
    16221629                }
    1623         | declaration '@' updowneq '@' '~' '@'                          // CFA, invalid syntax rule
     1630        | declaration '@' updownS '@' '~' '@'                           // CFA, invalid syntax rule
    16241631                { SemanticError( yylloc, "illegal syntax, missing low/high value for ascending/descending range so index is uninitialized." ); $$ = nullptr; }
    16251632
     
    16281635                        $$ = enumRangeCtrl( $1, OperKinds::LEThan, new ExpressionNode( new ast::TypeExpr( yylloc, $3->clone()->buildType() ) ), $3 );
    16291636                }
    1630         | comma_expression ';' downupdowneq enum_key            // CFA, enum type, reverse direction
     1637        | comma_expression ';' updown enum_key                          // CFA, enum type, reverse direction
    16311638                {
    16321639                        if ( $3 == OperKinds::GThan ) {
     
    16561663        ;
    16571664
    1658 // This rule exists to handle the ambiguity with unary operator '~'. The rule is the same as updowneq minus the '~'.
     1665// This rule exists to handle the ambiguity with unary operator '~'. The rule is the same as updownS minus the '~'.
    16591666// Specifically, "for ( ~5 )" means the complement of 5, not loop 0..4. Hence, in this case "for ( ~= 5 )", i.e., 0..5,
    16601667// it is not possible to just remove the '='. The entire '~=' must be removed.
    1661 downupdowneq:
    1662         ErangeUp
     1668updown:
     1669        ErangeUpLt
    16631670                { $$ = OperKinds::LThan; }
    1664         | ErangeDown
     1671        | ErangeDownGt
    16651672                { $$ = OperKinds::GThan; }
    1666         | ErangeUpEq
     1673        | ErangeUpLe
    16671674                { $$ = OperKinds::LEThan; }
    1668         | ErangeDownEq
     1675        | ErangeDownGe
    16691676                { $$ = OperKinds::GEThan; }
    16701677        ;
    16711678
    1672 updown:
     1679updownS:
    16731680        '~'                                                                                                     // shorthand 0 ~ 10 => 0 +~ 10
    16741681                { $$ = OperKinds::LThan; }
    1675         | ErangeUp
    1676                 { $$ = OperKinds::LThan; }
    1677         | ErangeDown
    1678                 { $$ = OperKinds::GThan; }
    1679         ;
    1680 
    1681 updowneq:
    1682         updown
    1683         | ErangeUpEq
    1684                 { $$ = OperKinds::LEThan; }
     1682        | updown
     1683        ;
     1684
     1685updownEq:
     1686        ErangeEq
     1687                { $$ = OperKinds::Eq; }
     1688        | ErangeNe
     1689                { $$ = OperKinds::Neq; }
    16851690        | ErangeDownEq
    1686                 { $$ = OperKinds::GEThan; }
     1691                { $$ = OperKinds::Eq; }
     1692        | ErangeDownNe
     1693                { $$ = OperKinds::Neq; }
    16871694        ;
    16881695
     
    40614068        '~'
    40624069                { $$ = OperKinds::LThan; }
    4063         | ErangeUpEq
     4070        | ErangeUpLe
    40644071                { $$ = OperKinds::LEThan; }
    40654072        ;
Note: See TracChangeset for help on using the changeset viewer.