Changeset d48e529


Ignore:
Timestamp:
Sep 19, 2017, 1:22:51 PM (4 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
aaron-thesis, arm-eh, cleanup-dtors, deferred_resn, demangler, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, resolv-new, with_gc
Children:
a9a4771
Parents:
4e8949f
Message:

Begin to introduce support for yylloc in the parser and extend CodeLocation? to include start column and end column/line number information

Location:
src
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • src/CodeGen/CodeGenerator.cc

    r4e8949f rd48e529  
    8989                } else if ( currentLocation.followedBy( to, 1 ) ) {
    9090                        output << "\n" << indent;
    91                         currentLocation.linenumber += 1;
     91                        currentLocation.first_line += 1;
    9292                } else if ( currentLocation.followedBy( to, 2 ) ) {
    9393                        output << "\n\n" << indent;
    94                         currentLocation.linenumber += 2;
    95                 } else {
    96                         output << "\n# " << to.linenumber << " \"" << to.filename
     94                        currentLocation.first_line += 2;
     95                } else {
     96                        output << "\n# " << to.first_line << " \"" << to.filename
    9797                               << "\"\n" << indent;
    9898                        currentLocation = to;
  • src/Common/CodeLocation.h

    r4e8949f rd48e529  
    2020
    2121struct CodeLocation {
    22         int linenumber;
    23         std::string filename;
     22        int first_line = -1, first_column = -1, last_line = -1, last_column = -1;
     23        std::string filename = "";
    2424
    2525        /// Create a new unset CodeLocation.
    26                 CodeLocation()
    27                 : linenumber( -1 )
    28                 , filename("")
    29         {}
     26        CodeLocation() = default;
    3027
    3128        /// Create a new CodeLocation with the given values.
    3229        CodeLocation( const char* filename, int lineno )
    33                 : linenumber( lineno )
     30                : first_line( lineno )
    3431                , filename(filename ? filename : "")
    3532        {}
     
    3835
    3936        bool isSet () const {
    40                 return -1 != linenumber;
     37                return -1 != first_line;
    4138        }
    4239
     
    4643
    4744        bool followedBy( CodeLocation const & other, int seperation ) {
    48                 return (linenumber + seperation == other.linenumber &&
     45                return (first_line + seperation == other.first_line &&
    4946                        filename == other.filename);
    5047        }
     
    6158inline std::ostream & operator<<( std::ostream & out, const CodeLocation & location ) {
    6259        // Column number ":1" allows IDEs to parse the error message and position the cursor in the source text.
    63         return location.isSet() ? out << location.filename << ":" << location.linenumber << ":1 " : out;
     60        return location.isSet() ? out << location.filename << ":" << location.first_line << ":1 " : out;
    6461}
  • src/Common/SemanticError.h

    r4e8949f rd48e529  
    3232
    3333        void maybeSet( const CodeLocation & location ) {
    34                 if( this->location.linenumber < 0 ) {
     34                if( this->location.isUnset() ) {
    3535                        this->location = location;
    3636                }
  • src/ControlStruct/ExceptTranslate.cc

    r4e8949f rd48e529  
    622622                                assertf(false, "Invalid throw in %s at %i\n",
    623623                                        throwStmt->location.filename.c_str(),
    624                                         throwStmt->location.linenumber);
     624                                        throwStmt->location.first_line);
    625625                                return nullptr;
    626626                        }
     
    633633                                assertf(false, "Invalid throwResume in %s at %i\n",
    634634                                        throwStmt->location.filename.c_str(),
    635                                         throwStmt->location.linenumber);
     635                                        throwStmt->location.first_line);
    636636                                return nullptr;
    637637                        }
  • src/Parser/ParseNode.h

    r4e8949f rd48e529  
    4444//##############################################################################
    4545
     46typedef CodeLocation YYLTYPE;
     47#define YYLTYPE_IS_DECLARED 1 /* alert the parser that we have our own definition */
     48
    4649extern char * yyfilename;
    4750extern int yylineno;
     51extern YYLTYPE yylloc;
    4852
    4953class ParseNode {
     
    7377        ParseNode * next = nullptr;
    7478        std::string * name = nullptr;
    75         CodeLocation location = { yyfilename, yylineno };
     79        CodeLocation location = yylloc;
    7680}; // ParseNode
    7781
  • src/Parser/lex.ll

    r4e8949f rd48e529  
    2626
    2727unsigned int column = 0;                                                                // position of the end of the last token parsed
    28 #define YY_USER_ACTION column += yyleng;                                // trigger before each matching rule's action
     28#define YY_USER_ACTION yylloc.first_line = yylineno; yylloc.first_column = column; column += yyleng; yylloc.last_column = column; yylloc.last_line = yylineno; yylloc.filename = yyfilename ? yyfilename : "";                          // trigger before each matching rule's action
    2929
    3030#include <string>
  • src/Parser/parser.yy

    r4e8949f rd48e529  
    116116
    117117bool forall = false;                                                                    // aggregate have one or more forall qualifiers ?
     118
     119# define YYLLOC_DEFAULT(Cur, Rhs, N)                            \
     120do                                                              \
     121        if (N) {                                                      \
     122                (Cur).first_line   = YYRHSLOC(Rhs, 1).first_line;           \
     123                (Cur).first_column = YYRHSLOC(Rhs, 1).first_column;         \
     124                (Cur).last_line    = YYRHSLOC(Rhs, N).last_line;            \
     125                (Cur).last_column  = YYRHSLOC(Rhs, N).last_column;          \
     126                (Cur).filename     = YYRHSLOC(Rhs, 1).filename;             \
     127        } else {                                                      \
     128                (Cur).first_line   = (Cur).last_line   =                    \
     129                        YYRHSLOC(Rhs, 0).last_line;                               \
     130                (Cur).first_column = (Cur).last_column =                    \
     131                        YYRHSLOC(Rhs, 0).last_column;                             \
     132                (Cur).filename     = YYRHSLOC(Rhs, 0).filename;             \
     133        }                                                             \
     134while (0)
    118135%}
    119136
     
    346363%precedence ELSE        // token precedence for start of else clause in IF/WAITFOR statement
    347364
     365%locations
    348366
    349367%start translation_unit                                                                 // parse-tree root
Note: See TracChangeset for help on using the changeset viewer.