1 / 19

CMPE 152: Compiler Design March 28 Class Meeting

CMPE 152: Compiler Design March 28 Class Meeting. Department of Computer Engineering San Jose State University Spring 2019 Instructor: Ron Mak www.cs.sjsu.edu/~mak. Mac: Useful Scripts for ANTLR 4. Put antlr-4.7-complete.jar in your system CLASSPATH : Create aliases: Use your file paths.

nigelt
Download Presentation

CMPE 152: Compiler Design March 28 Class Meeting

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CMPE 152: Compiler DesignMarch 28 Class Meeting Department of Computer EngineeringSan Jose State UniversitySpring 2019Instructor: Ron Mak www.cs.sjsu.edu/~mak

  2. Mac: Useful Scripts for ANTLR 4 • Put antlr-4.7-complete.jar in your system CLASSPATH: • Create aliases: • Use your file paths. • Put the both in your ~/.bashrc or ~/.bash_profile to make them take effect for every terminal window that you open. export ANTLR_JAR="/Users/rmak/Java/antlr-4.7/antlr-4.7-complete.jar" export CLASSPATH="$CLASSPATH:$ANTLR_JAR" alias antlr4="java -jar $ANTLR_JAR" alias grun='java org.antlr.v4.gui.TestRig'

  3. Mac: Useful Scripts for ANTLR 4, cont’d • Instead of the aliases you can also create shell scripts. • You still need to first set your CLASSPATH. • antlr4: • grun: #!/bin/sh java -jar /Users/rmak/Java/antlr-4.7/antlr-4.7-complete.jar $1 $2 $3 #!/bin/sh java org.antlr.v4.gui.TestRig $1 $2 $3 $4

  4. Mac: Useful Scripts for ANTLR 4, cont’d • Put both in a directory that is in yourexecution PATH • Edit yourPATHin ~/.bashrcif necessary • Make each script executable: chmoda+x antlr4 chmoda+xgrun

  5. Windows: Useful Scripts for ANTLR 4 • Create batch file antlr4.bat (for Java) • Create batch file antlr4cpp.bat (for C++) • Create batch file grun.bat (for Java only) • Use your file paths. • Put both in a directory that is in yourexecution PATH • To update your PATH, run the Settings app, type “env” in the search box, and edit the system environment variables. java -jar C:\antlr4-4.7.1\antlr-4.7.1-complete.jar %1 java -jar C:\antlr4-4.7.1\antlr-4.7.1-complete.jar –Dlanguage="Cpp" %1 java -cp .;C:\antlr4-4.7.1\antlr-4.7.1-complete.jar org.antlr.v4.gui.TestRig %1 %2 %3 %4

  6. Parse Tree Processing • Recall that after the frontend parser builds the parse tree, it’s the backend that processes it. • ANTLR provides utilities to process the parse tree.

  7. Listener and Visitor Interfaces • ANTLR can generate code to process a parse tree with two types of tree walkers: • The listener interface (default) • Simple to understand, but limited capabilities. • You have little control how the walk is performed. • We won’t be using this interface. • The visitor interface • You have more control over how to walk the tree. • But a more complex interface.

  8. Parse Tree Visitor Interface • The visitor interface gives you more control over the tree walk. • Specify -visitor on the antlr4 command. • Also -no-listener and –Dlanguage="Cpp" • ANTLR generates a grammar-specific visitor interface and a visitor method per rule. • You must initiate the visit by calling visit() on the parse tree root. antlr4 -no-listener -visitor –Dlanguage="Cpp" LabeledExpr.g4

  9. Visitor Interface Example • Interpret arithmetic expressions by computing values in the back end. • Label each rule alternative. • ANTLR generates a different visitor per labeled alternative. • Default: ANTLR generates only one visitor per rule.

  10. Visitor Interface Example, cont’d LabeledExpr.g4 grammar LabeledExpr; prog:   stat+ ; stat:   expr NEWLINE                # printExpr     |   ID '=' expr NEWLINE         # assign     |   NEWLINE                     # blank     ; expr:   expr op=('*'|'/') expr      # MulDiv     |   expr op=('+'|'-') expr      # AddSub     |   INT                         # int     |   ID                          # id     |   '(' expr ')'                # parens     ; MUL :   '*' ; // assigns token name to '*' used above in grammar DIV :   '/' ; ADD :   '+' ; SUB :   '-' ; ID  :   [a-zA-Z]+ ;      // match identifiers INT :   [0-9]+ ;         // match integers NEWLINE:'\r'? '\n' ;     // return newlines to parser (is end-statement signal) WS  :   [ \t]+ -> skip ; // toss out whitespace Labeled rules Named tokens

  11. Visitor Interface Example, cont’d • ANTLR-generated visitor interface • Uses antlrcpp::Any to handle different result types. class LabeledExprVisitor : public antlr4::tree::AbstractParseTreeVisitor { public:     virtual antlrcpp::Any visitProg(LabeledExprParser::ProgContext *context) = 0;   virtual antlrcpp::Any visitPrintExpr(LabeledExprParser::PrintExprContext *context) = 0;     virtual antlrcpp::Any visitAssign(LabeledExprParser::AssignContext *context) = 0;     virtual antlrcpp::Any visitBlank(LabeledExprParser::BlankContext *context) = 0;     virtual antlrcpp::Any visitParens(LabeledExprParser::ParensContext *context) = 0;     virtual antlrcpp::Any visitMulDiv(LabeledExprParser::MulDivContext *context) = 0;     virtual antlrcpp::Any visitAddSub(LabeledExprParser::AddSubContext *context) = 0;     virtual antlrcpp::Any visitId(LabeledExprParser::IdContext *context) = 0;     virtual antlrcpp::Any visitInt(LabeledExprParser::IntContext *context) = 0; }; LabeledExprVisitor.h

  12. Visitor Interface Example, cont’d • Default implementation: During each visit, just visit the children. LabeledExprBaseVisitor.h class  LabeledExprBaseVisitor : public LabeledExprVisitor { public:   virtual antlrcpp::Any visitProg(LabeledExprParser::ProgContext *ctx) override {     return visitChildren(ctx);   }   virtual antlrcpp::Any visitPrintExpr(LabeledExprParser::PrintExprContext *ctx) override {     return visitChildren(ctx);   }   virtual antlrcpp::Any visitAssign(LabeledExprParser::AssignContext *ctx) override {     return visitChildren(ctx);   }   virtual antlrcpp::Any visitBlank(LabeledExprParser::BlankContext *ctx) override {     return visitChildren(ctx);   }

  13. Visitor Interface Example, cont’d   virtual antlrcpp::Any visitParens(LabeledExprParser::ParensContext *ctx) override {     return visitChildren(ctx);   }   virtual antlrcpp::Any visitMulDiv(LabeledExprParser::MulDivContext *ctx) override {     return visitChildren(ctx);   }   virtual antlrcpp::Any visitAddSub(LabeledExprParser::AddSubContext *ctx) override {     return visitChildren(ctx);   }   virtual antlrcpp::Any visitId(LabeledExprParser::IdContext *ctx) override {     return visitChildren(ctx);   }   virtual antlrcpp::Any visitInt(LabeledExprParser::IntContext *ctx) override {     return visitChildren(ctx);   } }; LabeledExprBaseVisitor.h

  14. Visitor Interface Example, cont’d • Override the pertinent visitor methods. • Based on the needs of your back end. EvalVisitor.h class EvalVisitor : public LabeledExprBaseVisitor { public: antlrcpp::Any visitAssign(LabeledExprParser::AssignContext *ctx) override; antlrcpp::Any visitPrintExpr(LabeledExprParser::PrintExprContext *ctx) override; antlrcpp::Any visitInt(LabeledExprParser::IntContext *ctx) override; antlrcpp::Any visitId(LabeledExprParser::IdContext *ctx) override; antlrcpp::Any visitMulDiv(LabeledExprParser::MulDivContext *ctx) override; antlrcpp::Any visitAddSub(LabeledExprParser::AddSubContext *ctx) override; antlrcpp::Any visitParens(LabeledExprParser::ParensContext *ctx) override; private: map<string, int> memory; };

  15. Visitor Interface Example, cont’d antlrcpp::Any EvalVisitor::visitAssign(LabeledExprParser::AssignContext *ctx) {     string id = ctx->ID()->getText(); int value = visit(ctx->expr());     memory[id] = value;     return value; } antlrcpp::Any EvalVisitor::visitPrintExpr(LabeledExprParser::PrintExprContext *ctx) { int value = visit(ctx->expr()); cout << value << endl;     return 0; } antlrcpp::Any EvalVisitor::visitInt(LabeledExprParser::IntContext *ctx) {     return stoi(ctx->INT()->getText()); } EvalVisitor.cpp

  16. Visitor Interface Example, cont’d EvalVisitor.cpp antlrcpp::Any EvalVisitor::visitId(LabeledExprParser::IdContext *ctx) {     string id = ctx->ID()->getText();     return (memory.find(id) != memory.end())     ? memory[id] : 0; } antlrcpp::Any EvalVisitor::visitMulDiv(LabeledExprParser::MulDivContext *ctx) { int left  = visit(ctx->expr(0)); int right = visit(ctx->expr(1)); return (ctx->op->getType() == LabeledExprParser::MUL)             ? left*right : left/right; }

  17. Visitor Interface Example, cont’d EvalVisitor.cpp antlrcpp::Any EvalVisitor::visitAddSub(LabeledExprParser::AddSubContext *ctx) { int left  = visit(ctx->expr(0)); int right = visit(ctx->expr(1));     return (ctx->op->getType() == LabeledExprParser::ADD)             ? left + right : left - right; } antlrcpp::Any EvalVisitor::visitParens(LabeledExprParser::ParensContext *ctx) {     return visit(ctx->expr()); }

  18. Visitor Interface Example, cont’d • The main program: Calc.cpp int main(intargc, const char *args[]) { ifstream ins; ins.open(args[1]); ANTLRInputStream input(ins); LabeledExprLexer lexer(&input); CommonTokenStream tokens(&lexer); LabeledExprParser parser(&tokens);     tree::ParseTree *tree = parser.prog(); cout << "Parse tree:" << endl; cout << tree->toStringTree(&parser) << endl; cout << endl << "Evaluation:" << endl; EvalVisitoreval; eval.visit(tree);     delete tree;     return 0; } Demo

  19. Assignment #6 Grammar • Recall the minimum compiler project: • At least two data types with type checking. • Basic arithmetic operations with operator precedence. • Assignment statements. • At least one conditional control statement (e.g., IF). • At least one looping control statement. • Procedures or functions with calls and returns. • Parameters passed by value or by reference. • Basic error recovery (skip to semicolon or end of line).

More Related