From 983f4cd852fcc2511de1f186f59d82afe7173aed Mon Sep 17 00:00:00 2001 From: Joshua Potter Date: Sat, 15 Feb 2014 21:00:29 -0500 Subject: [PATCH] Recursive Descent Parsing Implemented tokenizer/scanner and recursive descent parser. --- .gitignore | 215 +++++++++ docs/PA1.pdf | Bin 0 -> 155789 bytes miniJava/src/miniJava/Compiler.java | 35 ++ .../miniJava/SyntacticAnalyzer/Parser.java | 409 ++++++++++++++++++ .../miniJava/SyntacticAnalyzer/Scanner.java | 249 +++++++++++ .../src/miniJava/SyntacticAnalyzer/Token.java | 78 ++++ .../miniJava/SyntacticAnalyzer/grammar.txt | 40 ++ miniJava/src/tester/Checkpoint1.java | 71 +++ miniJava/test.java | 7 + miniJava/tests/pa1_tests/fail101.java | 2 + miniJava/tests/pa1_tests/fail102.java | 2 + miniJava/tests/pa1_tests/fail103.java | 2 + miniJava/tests/pa1_tests/fail104.java | 2 + miniJava/tests/pa1_tests/fail117.java | 2 + miniJava/tests/pa1_tests/fail118.java | 3 + miniJava/tests/pa1_tests/fail119.java | 2 + miniJava/tests/pa1_tests/fail125.java | 7 + miniJava/tests/pa1_tests/fail126.java | 7 + miniJava/tests/pa1_tests/fail127.java | 7 + miniJava/tests/pa1_tests/fail128.java | 7 + miniJava/tests/pa1_tests/fail130.java | 5 + miniJava/tests/pa1_tests/fail131.java | 5 + miniJava/tests/pa1_tests/fail140.java | 6 + miniJava/tests/pa1_tests/fail141.java | 6 + miniJava/tests/pa1_tests/fail142.java | 6 + miniJava/tests/pa1_tests/fail143.java | 6 + miniJava/tests/pa1_tests/fail144.java | 6 + miniJava/tests/pa1_tests/fail145.java | 6 + miniJava/tests/pa1_tests/fail146.java | 8 + miniJava/tests/pa1_tests/fail147.java | 8 + miniJava/tests/pa1_tests/fail148.java | 8 + miniJava/tests/pa1_tests/fail149.java | 8 + miniJava/tests/pa1_tests/fail150.java | 6 + miniJava/tests/pa1_tests/fail151.java | 6 + miniJava/tests/pa1_tests/fail152.java | 6 + miniJava/tests/pa1_tests/fail153.java | 6 + miniJava/tests/pa1_tests/fail154.java | 6 + miniJava/tests/pa1_tests/fail155.java | 6 + miniJava/tests/pa1_tests/fail156.java | 8 + miniJava/tests/pa1_tests/fail157.java | 6 + miniJava/tests/pa1_tests/fail158.java | 6 + miniJava/tests/pa1_tests/fail159.java | 8 + miniJava/tests/pa1_tests/fail160.java | 8 + miniJava/tests/pa1_tests/fail161.java | 8 + miniJava/tests/pa1_tests/fail162.java | 8 + miniJava/tests/pa1_tests/fail163.java | 8 + miniJava/tests/pa1_tests/fail164.java | 8 + miniJava/tests/pa1_tests/fail165.java | 8 + miniJava/tests/pa1_tests/fail166.java | 8 + miniJava/tests/pa1_tests/fail167.java | 8 + miniJava/tests/pa1_tests/fail168.java | 8 + miniJava/tests/pa1_tests/fail169.java | 8 + miniJava/tests/pa1_tests/pass100.java | 2 + miniJava/tests/pa1_tests/pass101.java | 3 + miniJava/tests/pa1_tests/pass102.java | 3 + miniJava/tests/pa1_tests/pass103.java | 3 + miniJava/tests/pa1_tests/pass105.java | 3 + miniJava/tests/pa1_tests/pass110.java | 3 + miniJava/tests/pa1_tests/pass113.java | 2 + miniJava/tests/pa1_tests/pass117.java | 3 + miniJava/tests/pa1_tests/pass118.java | 3 + miniJava/tests/pa1_tests/pass119.java | 3 + miniJava/tests/pa1_tests/pass120.java | 3 + miniJava/tests/pa1_tests/pass121.java | 8 + miniJava/tests/pa1_tests/pass123.java | 7 + miniJava/tests/pa1_tests/pass124.java | 7 + miniJava/tests/pa1_tests/pass125.java | 7 + miniJava/tests/pa1_tests/pass126.java | 7 + miniJava/tests/pa1_tests/pass127.java | 7 + miniJava/tests/pa1_tests/pass128.java | 7 + miniJava/tests/pa1_tests/pass129.java | 7 + miniJava/tests/pa1_tests/pass130.java | 0 miniJava/tests/pa1_tests/pass131.java | 12 + miniJava/tests/pa1_tests/pass132.java | 3 + miniJava/tests/pa1_tests/pass133.java | 3 + miniJava/tests/pa1_tests/pass134.java | 2 + miniJava/tests/pa1_tests/pass135.java | 2 + miniJava/tests/pa1_tests/pass136.java | 2 + miniJava/tests/pa1_tests/pass137.java | 2 + miniJava/tests/pa1_tests/pass140.java | 5 + miniJava/tests/pa1_tests/pass141.java | 5 + miniJava/tests/pa1_tests/pass142.java | 5 + miniJava/tests/pa1_tests/pass143.java | 5 + miniJava/tests/pa1_tests/pass144.java | 5 + miniJava/tests/pa1_tests/pass145.java | 5 + miniJava/tests/pa1_tests/pass146.java | 5 + miniJava/tests/pa1_tests/pass147.java | 5 + miniJava/tests/pa1_tests/pass148.java | 5 + miniJava/tests/pa1_tests/pass150.java | 9 + miniJava/tests/pa1_tests/pass151.java | 20 + miniJava/tests/pa1_tests/pass152.java | 8 + miniJava/tests/pa1_tests/pass153.java | 8 + miniJava/tests/pa1_tests/pass154.java | 23 + miniJava/tests/pa1_tests/pass155.java | 21 + miniJava/tests/pa1_tests/pass158.java | 12 + miniJava/tests/pa1_tests/pass159.java | 11 + miniJava/tests/pa1_tests/pass160.java | 9 + miniJava/tests/pa1_tests/pass161.java | 8 + miniJava/tests/pa1_tests/pass162.java | 8 + miniJava/tests/pa1_tests/pass163.java | 8 + miniJava/tests/pa1_tests/pass164.java | 8 + miniJava/tests/pa1_tests/pass165.java | 9 + miniJava/tests/pa1_tests/pass166.java | 9 + miniJava/tests/pa1_tests/pass167.java | 8 + miniJava/tests/pa1_tests/pass168.java | 9 + miniJava/tests/pa1_tests/pass169.java | 8 + miniJava/tests/src/tester/Checkpoint1.java | 71 +++ miniJava/tests/test.java | 7 + 108 files changed, 1802 insertions(+) create mode 100644 .gitignore create mode 100644 docs/PA1.pdf create mode 100644 miniJava/src/miniJava/Compiler.java create mode 100644 miniJava/src/miniJava/SyntacticAnalyzer/Parser.java create mode 100644 miniJava/src/miniJava/SyntacticAnalyzer/Scanner.java create mode 100644 miniJava/src/miniJava/SyntacticAnalyzer/Token.java create mode 100644 miniJava/src/miniJava/SyntacticAnalyzer/grammar.txt create mode 100644 miniJava/src/tester/Checkpoint1.java create mode 100644 miniJava/test.java create mode 100644 miniJava/tests/pa1_tests/fail101.java create mode 100644 miniJava/tests/pa1_tests/fail102.java create mode 100644 miniJava/tests/pa1_tests/fail103.java create mode 100644 miniJava/tests/pa1_tests/fail104.java create mode 100644 miniJava/tests/pa1_tests/fail117.java create mode 100644 miniJava/tests/pa1_tests/fail118.java create mode 100644 miniJava/tests/pa1_tests/fail119.java create mode 100644 miniJava/tests/pa1_tests/fail125.java create mode 100644 miniJava/tests/pa1_tests/fail126.java create mode 100644 miniJava/tests/pa1_tests/fail127.java create mode 100644 miniJava/tests/pa1_tests/fail128.java create mode 100644 miniJava/tests/pa1_tests/fail130.java create mode 100644 miniJava/tests/pa1_tests/fail131.java create mode 100644 miniJava/tests/pa1_tests/fail140.java create mode 100644 miniJava/tests/pa1_tests/fail141.java create mode 100644 miniJava/tests/pa1_tests/fail142.java create mode 100644 miniJava/tests/pa1_tests/fail143.java create mode 100644 miniJava/tests/pa1_tests/fail144.java create mode 100644 miniJava/tests/pa1_tests/fail145.java create mode 100644 miniJava/tests/pa1_tests/fail146.java create mode 100644 miniJava/tests/pa1_tests/fail147.java create mode 100644 miniJava/tests/pa1_tests/fail148.java create mode 100644 miniJava/tests/pa1_tests/fail149.java create mode 100644 miniJava/tests/pa1_tests/fail150.java create mode 100644 miniJava/tests/pa1_tests/fail151.java create mode 100644 miniJava/tests/pa1_tests/fail152.java create mode 100644 miniJava/tests/pa1_tests/fail153.java create mode 100644 miniJava/tests/pa1_tests/fail154.java create mode 100644 miniJava/tests/pa1_tests/fail155.java create mode 100644 miniJava/tests/pa1_tests/fail156.java create mode 100644 miniJava/tests/pa1_tests/fail157.java create mode 100644 miniJava/tests/pa1_tests/fail158.java create mode 100644 miniJava/tests/pa1_tests/fail159.java create mode 100644 miniJava/tests/pa1_tests/fail160.java create mode 100644 miniJava/tests/pa1_tests/fail161.java create mode 100644 miniJava/tests/pa1_tests/fail162.java create mode 100644 miniJava/tests/pa1_tests/fail163.java create mode 100644 miniJava/tests/pa1_tests/fail164.java create mode 100644 miniJava/tests/pa1_tests/fail165.java create mode 100644 miniJava/tests/pa1_tests/fail166.java create mode 100644 miniJava/tests/pa1_tests/fail167.java create mode 100644 miniJava/tests/pa1_tests/fail168.java create mode 100644 miniJava/tests/pa1_tests/fail169.java create mode 100644 miniJava/tests/pa1_tests/pass100.java create mode 100644 miniJava/tests/pa1_tests/pass101.java create mode 100644 miniJava/tests/pa1_tests/pass102.java create mode 100644 miniJava/tests/pa1_tests/pass103.java create mode 100644 miniJava/tests/pa1_tests/pass105.java create mode 100644 miniJava/tests/pa1_tests/pass110.java create mode 100644 miniJava/tests/pa1_tests/pass113.java create mode 100644 miniJava/tests/pa1_tests/pass117.java create mode 100644 miniJava/tests/pa1_tests/pass118.java create mode 100644 miniJava/tests/pa1_tests/pass119.java create mode 100644 miniJava/tests/pa1_tests/pass120.java create mode 100644 miniJava/tests/pa1_tests/pass121.java create mode 100644 miniJava/tests/pa1_tests/pass123.java create mode 100644 miniJava/tests/pa1_tests/pass124.java create mode 100644 miniJava/tests/pa1_tests/pass125.java create mode 100644 miniJava/tests/pa1_tests/pass126.java create mode 100644 miniJava/tests/pa1_tests/pass127.java create mode 100644 miniJava/tests/pa1_tests/pass128.java create mode 100644 miniJava/tests/pa1_tests/pass129.java create mode 100644 miniJava/tests/pa1_tests/pass130.java create mode 100644 miniJava/tests/pa1_tests/pass131.java create mode 100644 miniJava/tests/pa1_tests/pass132.java create mode 100644 miniJava/tests/pa1_tests/pass133.java create mode 100644 miniJava/tests/pa1_tests/pass134.java create mode 100644 miniJava/tests/pa1_tests/pass135.java create mode 100644 miniJava/tests/pa1_tests/pass136.java create mode 100644 miniJava/tests/pa1_tests/pass137.java create mode 100644 miniJava/tests/pa1_tests/pass140.java create mode 100644 miniJava/tests/pa1_tests/pass141.java create mode 100644 miniJava/tests/pa1_tests/pass142.java create mode 100644 miniJava/tests/pa1_tests/pass143.java create mode 100644 miniJava/tests/pa1_tests/pass144.java create mode 100644 miniJava/tests/pa1_tests/pass145.java create mode 100644 miniJava/tests/pa1_tests/pass146.java create mode 100644 miniJava/tests/pa1_tests/pass147.java create mode 100644 miniJava/tests/pa1_tests/pass148.java create mode 100644 miniJava/tests/pa1_tests/pass150.java create mode 100644 miniJava/tests/pa1_tests/pass151.java create mode 100644 miniJava/tests/pa1_tests/pass152.java create mode 100644 miniJava/tests/pa1_tests/pass153.java create mode 100644 miniJava/tests/pa1_tests/pass154.java create mode 100644 miniJava/tests/pa1_tests/pass155.java create mode 100644 miniJava/tests/pa1_tests/pass158.java create mode 100644 miniJava/tests/pa1_tests/pass159.java create mode 100644 miniJava/tests/pa1_tests/pass160.java create mode 100644 miniJava/tests/pa1_tests/pass161.java create mode 100644 miniJava/tests/pa1_tests/pass162.java create mode 100644 miniJava/tests/pa1_tests/pass163.java create mode 100644 miniJava/tests/pa1_tests/pass164.java create mode 100644 miniJava/tests/pa1_tests/pass165.java create mode 100644 miniJava/tests/pa1_tests/pass166.java create mode 100644 miniJava/tests/pa1_tests/pass167.java create mode 100644 miniJava/tests/pa1_tests/pass168.java create mode 100644 miniJava/tests/pa1_tests/pass169.java create mode 100644 miniJava/tests/src/tester/Checkpoint1.java create mode 100644 miniJava/tests/test.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b9d6bd9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,215 @@ +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results + +[Dd]ebug/ +[Rr]elease/ +x64/ +build/ +[Bb]in/ +[Oo]bj/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.log +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +*.ncrunch* +.*crunch*.local.xml + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.Publish.xml +*.pubxml + +# NuGet Packages Directory +## TODO: If you have NuGet Package Restore enabled, uncomment the next line +#packages/ + +# Windows Azure Build Output +csx +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.[Pp]ublish.xml +*.pfx +*.publishsettings + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +App_Data/*.mdf +App_Data/*.ldf + +############# +## Windows detritus +############# + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Mac crap +.DS_Store + + +############# +## Python +############# + +*.py[co] + +# Packages +*.egg +*.egg-info +dist/ +build/ +eggs/ +parts/ +var/ +sdist/ +develop-eggs/ +.installed.cfg + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox + +#Translations +*.mo + +#Mr Developer +.mr.developer.cfg diff --git a/docs/PA1.pdf b/docs/PA1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b934180e0ae4acd225ef66e06e6a82bfa7b5de44 GIT binary patch literal 155789 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 stream; + + public Parser(Scanner scanner) { + this.scanner = scanner; + this.stream = new LinkedList(); + } + + + /** + * Program ::= (ClassDeclaration)* eot + * @throws IOException + */ + public void parse() throws IOException { + while(peek(1).type == Token.TYPE.CLASS) parseClassDeclaration(); + accept(Token.TYPE.EOT); + } + + + /** + * ClassDeclaration ::= + * class id { + * (Declarators id (; | MethodDeclaration))* + * } + * @throws IOException + */ + private void parseClassDeclaration() throws IOException { + + // Class Header + accept(Token.TYPE.CLASS); + accept(Token.TYPE.ID); + accept(Token.TYPE.LBRACKET); + + // Class Body + while(peek(1).type != Token.TYPE.RBRACKET) { + parseDeclarators(); + accept(Token.TYPE.ID); + if(peek(1).type == Token.TYPE.SEMICOLON) accept(Token.TYPE.SEMICOLON); + else parseMethodDeclaration(); + } + + accept(Token.TYPE.RBRACKET); + } + + + /** + * MethodDeclaration ::= + * (ParameterList?) { + * Statement* (return Expression ;)? + * } + * @throws IOException + */ + private void parseMethodDeclaration() throws IOException { + + // Method Header + accept(Token.TYPE.LPAREN); + if(peek(1).type != Token.TYPE.RPAREN) parseParameterList(); + accept(Token.TYPE.RPAREN); + accept(Token.TYPE.LBRACKET); + + // Method Body + while(peek(1).type != Token.TYPE.RBRACKET) { + + if(peek(1).type == Token.TYPE.RETURN) { + accept(Token.TYPE.RETURN); + parseExpression(); + accept(Token.TYPE.SEMICOLON); + break; + } + + parseStatement(); + } + + accept(Token.TYPE.RBRACKET); + } + + + /** + * Declarators ::= (public | private)? static? Type + * @throws IOException + */ + private void parseDeclarators() throws IOException { + + if(peek(1).type == Token.TYPE.PUBLIC) accept(Token.TYPE.PUBLIC); + else if(peek(1).type == Token.TYPE.PRIVATE) accept(Token.TYPE.PRIVATE); + + if(peek(1).type == Token.TYPE.STATIC) accept(Token.TYPE.STATIC); + parseType(); + } + + + /** + * Type ::= boolean | void | int ([])? | id ([])? + * @throws IOException + */ + private void parseType() throws IOException { + + Token.TYPE type = peek(1).type; + + switch(type) { + + case BOOLEAN: + case VOID: + accept(type); + break; + + case INT: + case ID: + accept(type); + if(peek(1).type == Token.TYPE.LSQUARE) { + accept(Token.TYPE.LSQUARE); + accept(Token.TYPE.RSQUARE); + } + break; + + default: + throw new IOException(); + } + } + + + /** + * ParameterList ::= Type id (, Type id)* + * @throws IOException + */ + private void parseParameterList() throws IOException { + parseType(); + accept(Token.TYPE.ID); + while(peek(1).type == Token.TYPE.COMMA) { + accept(Token.TYPE.COMMA); + parseType(); + accept(Token.TYPE.ID); + } + } + + + /** + * ArgumentList ::= Expression (, Expression)* + * @throws IOException + */ + private void parseArgumentList() throws IOException { + parseExpression(); + while(peek(1).type == Token.TYPE.COMMA) { + accept(Token.TYPE.COMMA); + parseExpression(); + } + } + + + /** + * Reference ::= BaseRef (. BaseRef)* + * @throws IOException + */ + private void parseReference() throws IOException { + parseBaseRef(); + while(peek(1).type == Token.TYPE.PERIOD) { + accept(Token.TYPE.PERIOD); + accept(Token.TYPE.ID); + if(peek(1).type == Token.TYPE.LSQUARE) { + accept(Token.TYPE.LSQUARE); + parseExpression(); + accept(Token.TYPE.RSQUARE); + } + } + } + + + /** + * BaseRef ::= this | id ([ Expression])? + * @throws IOException + */ + private void parseBaseRef() throws IOException { + + switch(peek(1).type) { + + // this + case THIS: + accept(Token.TYPE.THIS); + break; + + // id ([ Expression])? + default: + accept(Token.TYPE.ID); + if(peek(1).type == Token.TYPE.LSQUARE) { + accept(Token.TYPE.LSQUARE); + parseExpression(); + accept(Token.TYPE.RSQUARE); + } + break; + } + } + + + /** + * Statement ::= + * {Statement*} + * | Type id = Expression; + * | Reference = Expression; + * | Reference ( ArgumentList? ); + * | if (Expression) Statement (else Statement)? + * | while (Expression) Statement + * @throws IOException + */ + private void parseStatement() throws IOException { + + switch(peek(1).type) { + + // { Statement* } + case LBRACKET: + accept(Token.TYPE.LBRACKET); + while(peek(1).type != Token.TYPE.RBRACKET) { + parseStatement(); + } + accept(Token.TYPE.RBRACKET); + break; + + // if (Expression) Statement (else Statement)? + case IF: + accept(Token.TYPE.IF); + accept(Token.TYPE.LPAREN); + parseExpression(); + accept(Token.TYPE.RPAREN); + parseStatement(); + if(peek(1).type == Token.TYPE.ELSE) { + accept(Token.TYPE.ELSE); + parseStatement(); + } + break; + + // while (Expression) Statement + case WHILE: + accept(Token.TYPE.WHILE); + accept(Token.TYPE.LPAREN); + parseExpression(); + accept(Token.TYPE.RPAREN); + parseStatement(); + break; + + // Type id = Expression ; + case BOOLEAN: + case VOID: + case INT: + case ID: + + // Must be a type though there is a possibility of a reference + if(peek(1).type != Token.TYPE.ID + || peek(2).type == Token.TYPE.ID + ||(peek(2).type == Token.TYPE.LSQUARE && peek(3).type == Token.TYPE.RSQUARE)) { + parseType(); + accept(Token.TYPE.ID); + accept(Token.TYPE.EQUALS); + parseExpression(); + accept(Token.TYPE.SEMICOLON); + break; + } + + /* Fall Through */ + + // Reference = Expression ; | Reference ( ArgumentList? ) ; + default: + parseReference(); + + if(peek(1).type == Token.TYPE.LPAREN) { + accept(Token.TYPE.LPAREN); + if(peek(1).type != Token.TYPE.RPAREN) parseArgumentList(); + accept(Token.TYPE.RPAREN); + } else { + accept(Token.TYPE.EQUALS); + parseExpression(); + } + + accept(Token.TYPE.SEMICOLON); + break; + } + } + + + /** + * Expression ::= + * Reference + * | Reference ( ArgumentList? ) + * | unop Expression + * | Expression binop Expression + * | ( Expression ) + * | num | true | false + * | new (id() | int [ Expression ] | id [ Expression ] ) + * @throws IOException + */ + private void parseExpression() throws IOException { + + switch(peek(1).type) { + + // num | true | false + case NUM: + case TRUE: + case FALSE: + accept(peek(1).type); + break; + + // ( Expression ) + case LPAREN: + accept(Token.TYPE.LPAREN); + parseExpression(); + accept(Token.TYPE.RPAREN); + break; + + // unop Expression + case UNOP: + accept(Token.TYPE.UNOP); + parseExpression(); + break; + + // Must be a minus sign + case BINOP: + if(peek(1).attr.equals("-")) { + accept(Token.TYPE.BINOP); + parseExpression(); + } + else throw new IOException(); + break; + + // new ( int [ Expression ] | id ( ) | id [ Expression ] ) + case NEW: + accept(Token.TYPE.NEW); + + if(peek(1).type == Token.TYPE.INT) { + accept(Token.TYPE.INT); + accept(Token.TYPE.LSQUARE); + parseExpression(); + accept(Token.TYPE.RSQUARE); + } + + else { + accept(Token.TYPE.ID); + + if(peek(1).type == Token.TYPE.LPAREN){ + accept(Token.TYPE.LPAREN); + accept(Token.TYPE.RPAREN); + } + + else { + accept(Token.TYPE.LSQUARE); + parseExpression(); + accept(Token.TYPE.RSQUARE); + } + } + + break; + + // Reference | Reference (ArgumentList?) + case THIS: + case ID: + parseReference(); + if(peek(1).type == Token.TYPE.LPAREN) { + accept(Token.TYPE.LPAREN); + if(peek(1).type != Token.TYPE.RPAREN) parseArgumentList(); + accept(Token.TYPE.RPAREN); + } + break; + + // Expression binop Expression + default: + accept(Token.TYPE.BINOP); + parseExpression(); + break; + } + + // Expression binop Expression + if(peek(1).type == Token.TYPE.BINOP) { + accept(Token.TYPE.BINOP); + parseExpression(); + } + } + + + /** + * Sees what the next token is, caching the result. + * @return + * @throws IOException + */ + private Token peek(int lookahead) throws IOException { + + // Cache tokens + while(stream.size() < lookahead) { + Token next = scanner.scan(); + stream.addLast(next); + } + + return stream.get(lookahead - 1); + } + + + /** + * Consumes token or throws exception. + * @throws IOException + */ + private void accept(Token.TYPE type) throws IOException { + Token next = peek(1); + if(next.type == type) stream.poll(); + else throw new IOException(); + } +} diff --git a/miniJava/src/miniJava/SyntacticAnalyzer/Scanner.java b/miniJava/src/miniJava/SyntacticAnalyzer/Scanner.java new file mode 100644 index 0000000..49cb14d --- /dev/null +++ b/miniJava/src/miniJava/SyntacticAnalyzer/Scanner.java @@ -0,0 +1,249 @@ +package miniJava.SyntacticAnalyzer; + +import java.io.*; + +public class Scanner { + + private BufferedReader input; + + public Scanner(BufferedReader input) { + this.input = input; + } + + /** + * Scans in input, returning next token. + * @return + * @throws IOException + */ + public Token scan() throws IOException { + + String attr = ""; + Token token = null; + + while(token == null) { + + // Check for EOF + int c = input.read(); + if(c == -1) return new Token("", Token.TYPE.EOT); + + // Setup + attr += (char) c; + + switch(c) { + + // Operators + case '+': + case '*': + case '-': + token = new Token(attr, Token.TYPE.BINOP); + break; + + // Check for comment + case '/': + if(peek('*')) { input.read(); readComment(); attr = ""; } + else if(peek('/')) { readLine(); attr = ""; } + else token = new Token(attr, Token.TYPE.BINOP); + break; + + // Check for c or c= + case '>': + case '<': + if(peek('=')) attr += (char) input.read(); + token = new Token(attr, Token.TYPE.BINOP); + break; + + // Check for ! or != + case '!': + if(!peek('=')) token = new Token(attr, Token.TYPE.UNOP); + else { + attr += (char) input.read(); + token = new Token(attr, Token.TYPE.BINOP); + } + break; + + // Check for && or || + case '&': + case '|': + if(!peek((char) c)) throw new IOException(); + else { + attr += (char) input.read(); + token = new Token(attr, Token.TYPE.BINOP); + } + break; + + // Other Operators + case '=': + if(!peek('=')) token = new Token(attr, Token.TYPE.EQUALS); + else { + attr += (char) input.read(); + token = new Token(attr, Token.TYPE.BINOP); + } + break; + + case '.': + token = new Token(attr, Token.TYPE.PERIOD); + break; + + case ',': + token = new Token(attr, Token.TYPE.COMMA); + break; + + case '[': + token = new Token(attr, Token.TYPE.LSQUARE); + break; + + case ']': + token = new Token(attr, Token.TYPE.RSQUARE); + break; + + case '{': + token = new Token(attr, Token.TYPE.LBRACKET); + break; + + case '}': + token = new Token(attr, Token.TYPE.RBRACKET); + break; + + case '(': + token = new Token(attr, Token.TYPE.LPAREN); + break; + + case ')': + token = new Token(attr, Token.TYPE.RPAREN); + break; + + case ';': + token = new Token(attr, Token.TYPE.SEMICOLON); + break; + + default: + + // Identifier or Keyword + if(isAlpha((char) c)) { + for(char n = peek(); isAlpha(n) || isDigit(n) || n == '_';) { + attr += (char) input.read(); + n = peek(); + } + + if(Token.keywords.containsKey(attr)) { + token = new Token(attr, Token.keywords.get(attr)); + } else { + token = new Token(attr, Token.TYPE.ID); + } + } + + // Number + else if(isDigit((char) c)) { + for(char n = peek(); isDigit(n);) { + attr += (char) input.read(); + n = peek(); + } + + token = new Token(attr, Token.TYPE.NUM); + } + + // Whitespace + else if(isWhitespace((char) c)) { + attr = ""; + } + + // Unrecognized Character + else throw new IOException(); + + break; + } + } + System.out.println(token.type); + return token; + } + + + /** + * Looks at next character in stream without consuming. + * @return + * @throws IOException + */ + private char peek() throws IOException { + input.mark(1); + int next = input.read(); + input.reset(); + + return next == -1 ? '\0' : (char) next; + } + + + /** + * Returns whether passed character is next in stream. + * @param c + * @return + * @throws IOException + */ + private boolean peek(char c) throws IOException { + input.mark(1); + int next = input.read(); + input.reset(); + + return c == next; + } + + + /** + * Consumes input until an end of comment has been reached. + * @throws IOException + */ + private void readComment() throws IOException { + char prev = '\0', current = '\0'; + while(prev != '*' || current != '/') { + + prev = current; + + int next = input.read(); + if(next == -1) throw new IOException(); + else current = (char) next; + } + } + + + /** + * Consumes input until the end of line is reached + * @throws IOException + */ + private void readLine() throws IOException { + for(int n = 0; n != '\n' && n != '\r' && n != -1; n = input.read()) {} + } + + + /** + * Tells whether character is alphabetical. + * @param c + * @return + */ + private boolean isAlpha(char c) { + return (c >= 'a' && c <= 'z') + || (c >= 'A' && c <= 'Z'); + } + + + /** + * Tells whether character is numerical. + * @param c + * @return + */ + private boolean isDigit(char c) { + return c >= '0' && c <= '9'; + } + + + /** + * Tells wheter character is whitespace. + * @param c + * @return + */ + private boolean isWhitespace(char c) { + return c == ' ' + || c == '\n' + || c == '\r' + || c == '\t'; + } + +} diff --git a/miniJava/src/miniJava/SyntacticAnalyzer/Token.java b/miniJava/src/miniJava/SyntacticAnalyzer/Token.java new file mode 100644 index 0000000..f2593b2 --- /dev/null +++ b/miniJava/src/miniJava/SyntacticAnalyzer/Token.java @@ -0,0 +1,78 @@ +package miniJava.SyntacticAnalyzer; + +import java.util.HashMap; + +public class Token { + + public enum TYPE { + + // Possible Terminals + ID, + NUM, + UNOP, + BINOP, + + // Keywords + IF, + ELSE, + NEW, + INT, + VOID, + THIS, + TRUE, + FALSE, + CLASS, + WHILE, + RETURN, + BOOLEAN, + + // Declarators + STATIC, + PUBLIC, + PRIVATE, + + // Other Terminals + EQUALS, + PERIOD, + COMMA, + LPAREN, + RPAREN, + LSQUARE, + RSQUARE, + LBRACKET, + RBRACKET, + SEMICOLON, + + // End of Token Stream + EOT + }; + + public final static HashMap keywords; + static + { + keywords = new HashMap(); + keywords.put("class", TYPE.CLASS); + keywords.put("return", TYPE.RETURN); + keywords.put("public", TYPE.PUBLIC); + keywords.put("private", TYPE.PRIVATE); + keywords.put("static", TYPE.STATIC); + keywords.put("int", TYPE.INT); + keywords.put("boolean", TYPE.BOOLEAN); + keywords.put("void", TYPE.VOID); + keywords.put("this", TYPE.THIS); + keywords.put("if", TYPE.IF); + keywords.put("else", TYPE.ELSE); + keywords.put("while", TYPE.WHILE); + keywords.put("true", TYPE.TRUE); + keywords.put("false", TYPE.FALSE); + keywords.put("new", TYPE.NEW); + } + + public final TYPE type; + public final String attr; + + public Token(String attr, TYPE type) { + this.type = type; + this.attr = attr; + } +} diff --git a/miniJava/src/miniJava/SyntacticAnalyzer/grammar.txt b/miniJava/src/miniJava/SyntacticAnalyzer/grammar.txt new file mode 100644 index 0000000..0cf2bc3 --- /dev/null +++ b/miniJava/src/miniJava/SyntacticAnalyzer/grammar.txt @@ -0,0 +1,40 @@ +Program ::= (ClassDeclaration)* eot + +ClassDeclaration ::= + class id { + (Declarators id (; | MethodDeclaration))* + } + +MethodDeclaration ::= + (ParameterList?) { + Statement* (return Expression ;)? + } + +Declarators ::= (public | private)? static? Type + +Type ::= boolean | void | int ([])? | id ([])? + +ParameterList ::= Type id (, Type id)* + +ArgumentList ::= Expression (, Expression)* + +Reference ::= BaseRef (. id ([ Expression])?)* + +BaseRef ::= this | id ([ Expression])? + +Statement ::= + {Statement*} + | Type id = Expression; + | Reference = Expression; + | Reference ( ArgumentList? ); + | if (Expression) Statement (else Statement)? + | while (Expression) Statement + +Expression ::= + Reference + | Reference ( ArgumentList? ) + | unop Expression + | Expression binop Expression + | ( Expression ) + | num | true | false + | new (id() | int [ Expression ] | id [ Expression ] ) \ No newline at end of file diff --git a/miniJava/src/tester/Checkpoint1.java b/miniJava/src/tester/Checkpoint1.java new file mode 100644 index 0000000..2798140 --- /dev/null +++ b/miniJava/src/tester/Checkpoint1.java @@ -0,0 +1,71 @@ +package tester; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Scanner; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/* Automated regression tester for Checkpoint 1 tests + * Created by Max Beckman-Harned + * Put your tests in "tests/pa1_tests" folder in your Eclipse workspace directory + */ +public class Checkpoint1 { + + static ExecutorService threadPool = Executors.newCachedThreadPool(); + + public static void main(String[] args) throws IOException, InterruptedException { + File testDir = new File(System.getProperty("java.class.path") + "/../tests/pa1_tests"); + System.out.println(testDir.getAbsolutePath()); + int failures = 0; + for (File x : testDir.listFiles()) { + int returnCode = runTest(x); + if (x.getName().indexOf("pass") != -1) { + if (returnCode == 0) + System.out.println(x.getName() + " passed successfully!"); + else { + failures++; + System.err.println(x.getName() + + " failed but should have passed!"); + } + } else { + if (returnCode == 4) + System.out.println(x.getName() + " failed successfully!"); + else { + System.err.println(x.getName() + " did not fail properly!"); + failures++; + } + } + } + System.out.println(failures + " failures in all."); + } + + private static int runTest(File x) throws IOException, InterruptedException { + ProcessBuilder pb = new ProcessBuilder("java", "miniJava.Compiler", x.getPath()).directory(new File(System.getProperty("java.class.path"))); + Process p = pb.start(); + threadPool.execute(new ProcessOutputter(p.getInputStream(), false)); + p.waitFor(); + return p.exitValue(); + } + + static class ProcessOutputter implements Runnable { + private Scanner processOutput; + private boolean output; + + public ProcessOutputter(InputStream _processStream, boolean _output) { + processOutput = new Scanner(_processStream); + output = _output; + } + @Override + public void run() { + while(processOutput.hasNextLine()) { + String line = processOutput.nextLine(); + if (output) + System.out.println(line); + } + } + + + } +} diff --git a/miniJava/test.java b/miniJava/test.java new file mode 100644 index 0000000..eb38ef4 --- /dev/null +++ b/miniJava/test.java @@ -0,0 +1,7 @@ +// PA1 parse assign fail +class Test { + + void p(int a) { + that.this = 4; + } +} \ No newline at end of file diff --git a/miniJava/tests/pa1_tests/fail101.java b/miniJava/tests/pa1_tests/fail101.java new file mode 100644 index 0000000..bef9a56 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail101.java @@ -0,0 +1,2 @@ +// PA1 lex id fail +class _id {} diff --git a/miniJava/tests/pa1_tests/fail102.java b/miniJava/tests/pa1_tests/fail102.java new file mode 100644 index 0000000..2e6101b --- /dev/null +++ b/miniJava/tests/pa1_tests/fail102.java @@ -0,0 +1,2 @@ +// PA1 lex id fail +class boolean {} diff --git a/miniJava/tests/pa1_tests/fail103.java b/miniJava/tests/pa1_tests/fail103.java new file mode 100644 index 0000000..82e3c80 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail103.java @@ -0,0 +1,2 @@ +// PA1 parse fail +class Foo {}. \ No newline at end of file diff --git a/miniJava/tests/pa1_tests/fail104.java b/miniJava/tests/pa1_tests/fail104.java new file mode 100644 index 0000000..d92c716 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail104.java @@ -0,0 +1,2 @@ +// PA1 lex id fail +class true {} diff --git a/miniJava/tests/pa1_tests/fail117.java b/miniJava/tests/pa1_tests/fail117.java new file mode 100644 index 0000000..51c7eaf --- /dev/null +++ b/miniJava/tests/pa1_tests/fail117.java @@ -0,0 +1,2 @@ +// PA1 lex comment fail +class id {} /* unterminated diff --git a/miniJava/tests/pa1_tests/fail118.java b/miniJava/tests/pa1_tests/fail118.java new file mode 100644 index 0000000..ca9bf28 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail118.java @@ -0,0 +1,3 @@ +// PA1 lex comment fail +class /* /* nested */ */ id {} + diff --git a/miniJava/tests/pa1_tests/fail119.java b/miniJava/tests/pa1_tests/fail119.java new file mode 100644 index 0000000..9c6137f --- /dev/null +++ b/miniJava/tests/pa1_tests/fail119.java @@ -0,0 +1,2 @@ +// PA1 lex ill char fail +class NonTokens{} # diff --git a/miniJava/tests/pa1_tests/fail125.java b/miniJava/tests/pa1_tests/fail125.java new file mode 100644 index 0000000..935b0ea --- /dev/null +++ b/miniJava/tests/pa1_tests/fail125.java @@ -0,0 +1,7 @@ +// PA1 lex binop fail +class id { + void p(){ + int x = 1 &| 0; + } +} + diff --git a/miniJava/tests/pa1_tests/fail126.java b/miniJava/tests/pa1_tests/fail126.java new file mode 100644 index 0000000..826a67f --- /dev/null +++ b/miniJava/tests/pa1_tests/fail126.java @@ -0,0 +1,7 @@ +// PA1 lex binop fail +class id { + void p(){ + x = 1 + 2*3 = 4; + } +} + diff --git a/miniJava/tests/pa1_tests/fail127.java b/miniJava/tests/pa1_tests/fail127.java new file mode 100644 index 0000000..2b09ac6 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail127.java @@ -0,0 +1,7 @@ +// PA1 lex/parse binop fail +class id { + void p(){ + int x = 1 >> 0; + } +} + diff --git a/miniJava/tests/pa1_tests/fail128.java b/miniJava/tests/pa1_tests/fail128.java new file mode 100644 index 0000000..b8aec5e --- /dev/null +++ b/miniJava/tests/pa1_tests/fail128.java @@ -0,0 +1,7 @@ +// PA1 lex binop fail +class id { + void p(){ + while ( 1 > = 0) {} + } +} + diff --git a/miniJava/tests/pa1_tests/fail130.java b/miniJava/tests/pa1_tests/fail130.java new file mode 100644 index 0000000..11ded62 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail130.java @@ -0,0 +1,5 @@ +// PA1 lex trailing start char fail +class Almost { + public static void main (String [] args) { + } // nothing follows next slash +} / \ No newline at end of file diff --git a/miniJava/tests/pa1_tests/fail131.java b/miniJava/tests/pa1_tests/fail131.java new file mode 100644 index 0000000..bd14a4f --- /dev/null +++ b/miniJava/tests/pa1_tests/fail131.java @@ -0,0 +1,5 @@ +// PA1 lex comment fail +class IllegalComment { + public static void main (String [] args) { + } // nothing follows final * +}/* **** \ No newline at end of file diff --git a/miniJava/tests/pa1_tests/fail140.java b/miniJava/tests/pa1_tests/fail140.java new file mode 100644 index 0000000..1c2e42f --- /dev/null +++ b/miniJava/tests/pa1_tests/fail140.java @@ -0,0 +1,6 @@ +// PA1 parse field decl fail +class id { + static private Type x; +} + + diff --git a/miniJava/tests/pa1_tests/fail141.java b/miniJava/tests/pa1_tests/fail141.java new file mode 100644 index 0000000..c80863f --- /dev/null +++ b/miniJava/tests/pa1_tests/fail141.java @@ -0,0 +1,6 @@ +// PA1 parse field decl fail +class id { + public private static Type x; +} + + diff --git a/miniJava/tests/pa1_tests/fail142.java b/miniJava/tests/pa1_tests/fail142.java new file mode 100644 index 0000000..01a3966 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail142.java @@ -0,0 +1,6 @@ +// PA1 parse field decl fail +class id { + int x = 3; +} + + diff --git a/miniJava/tests/pa1_tests/fail143.java b/miniJava/tests/pa1_tests/fail143.java new file mode 100644 index 0000000..9ab06fe --- /dev/null +++ b/miniJava/tests/pa1_tests/fail143.java @@ -0,0 +1,6 @@ +// PA1 parse field decl fail +class id { + void int x; +} + + diff --git a/miniJava/tests/pa1_tests/fail144.java b/miniJava/tests/pa1_tests/fail144.java new file mode 100644 index 0000000..643af02 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail144.java @@ -0,0 +1,6 @@ +// PA1 parse field decl fail +class id { + public [] String x; +} + + diff --git a/miniJava/tests/pa1_tests/fail145.java b/miniJava/tests/pa1_tests/fail145.java new file mode 100644 index 0000000..4101c57 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail145.java @@ -0,0 +1,6 @@ +// PA1 parse field decl fail +class id { + public void [] x; +} + + diff --git a/miniJava/tests/pa1_tests/fail146.java b/miniJava/tests/pa1_tests/fail146.java new file mode 100644 index 0000000..827f6a8 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail146.java @@ -0,0 +1,8 @@ +// PA1 parse local decl fail +class id { + void foo() { + Nonesuch x[2] = 3; + } +} + + diff --git a/miniJava/tests/pa1_tests/fail147.java b/miniJava/tests/pa1_tests/fail147.java new file mode 100644 index 0000000..eddf6f3 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail147.java @@ -0,0 +1,8 @@ +// PA1 parse local decl fail +class id { + public void f(){ + Ref [] x(33); + } +} + + diff --git a/miniJava/tests/pa1_tests/fail148.java b/miniJava/tests/pa1_tests/fail148.java new file mode 100644 index 0000000..3089be4 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail148.java @@ -0,0 +1,8 @@ +// PA1 parse local decl fail +class id { + public void f(){ + int x; + } +} + + diff --git a/miniJava/tests/pa1_tests/fail149.java b/miniJava/tests/pa1_tests/fail149.java new file mode 100644 index 0000000..709f8a4 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail149.java @@ -0,0 +1,8 @@ +// PA1 parse local decl fail +class id { + public void f(){ + Foo x; + } +} + + diff --git a/miniJava/tests/pa1_tests/fail150.java b/miniJava/tests/pa1_tests/fail150.java new file mode 100644 index 0000000..bab8c4a --- /dev/null +++ b/miniJava/tests/pa1_tests/fail150.java @@ -0,0 +1,6 @@ +// PA1 parse local decl fail +class idfail { + public void foo () { + int [] x[3] = null; + } +} diff --git a/miniJava/tests/pa1_tests/fail151.java b/miniJava/tests/pa1_tests/fail151.java new file mode 100644 index 0000000..a4a41e9 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail151.java @@ -0,0 +1,6 @@ +// PA1 parse local decl fail +class LValueFail { + void foo () { + true = false; + } +} diff --git a/miniJava/tests/pa1_tests/fail152.java b/miniJava/tests/pa1_tests/fail152.java new file mode 100644 index 0000000..7c1edb6 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail152.java @@ -0,0 +1,6 @@ +// PA1 parse expr fail +class NonTokens{ + int main () { + return a++b; + } +} diff --git a/miniJava/tests/pa1_tests/fail153.java b/miniJava/tests/pa1_tests/fail153.java new file mode 100644 index 0000000..f67de82 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail153.java @@ -0,0 +1,6 @@ +// PA1 parse expr fail +class NonTokens{ + int main () { + return; + } +} diff --git a/miniJava/tests/pa1_tests/fail154.java b/miniJava/tests/pa1_tests/fail154.java new file mode 100644 index 0000000..5dd2152 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail154.java @@ -0,0 +1,6 @@ +// PA1 parse expr fail +class IllegalExpressions { + void main () { + z = a+!=b; + } +} diff --git a/miniJava/tests/pa1_tests/fail155.java b/miniJava/tests/pa1_tests/fail155.java new file mode 100644 index 0000000..dc85175 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail155.java @@ -0,0 +1,6 @@ +// PA1 parse stmt fail +class IllegalStmt { + void main () { + this; + } +} diff --git a/miniJava/tests/pa1_tests/fail156.java b/miniJava/tests/pa1_tests/fail156.java new file mode 100644 index 0000000..4fbab10 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail156.java @@ -0,0 +1,8 @@ +// PA1 parse expr fail +class IllegalExpressions { + static void foo (int a) { + if (a = a) { + a = a; + } + } +} diff --git a/miniJava/tests/pa1_tests/fail157.java b/miniJava/tests/pa1_tests/fail157.java new file mode 100644 index 0000000..d6e7d61 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail157.java @@ -0,0 +1,6 @@ +// PA1 parse unop fail +class IllegalExpressions { + void foo() { + z = a!b; + } +} diff --git a/miniJava/tests/pa1_tests/fail158.java b/miniJava/tests/pa1_tests/fail158.java new file mode 100644 index 0000000..bf2a79f --- /dev/null +++ b/miniJava/tests/pa1_tests/fail158.java @@ -0,0 +1,6 @@ +// PA1 parse ref fail +class IllegalExpressions { + void foo () { + a [b] [c] = d; // not ok + } +} diff --git a/miniJava/tests/pa1_tests/fail159.java b/miniJava/tests/pa1_tests/fail159.java new file mode 100644 index 0000000..a97db05 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail159.java @@ -0,0 +1,8 @@ +// PA1 parse method fail +class IllegalExpressions { + void foo () { + if (x != 0) + return x; + return y; + } +} diff --git a/miniJava/tests/pa1_tests/fail160.java b/miniJava/tests/pa1_tests/fail160.java new file mode 100644 index 0000000..89bb1cd --- /dev/null +++ b/miniJava/tests/pa1_tests/fail160.java @@ -0,0 +1,8 @@ +// PA1 parse refs fail +class Test { + + void p() { + A a [17] = 23; + } +} + diff --git a/miniJava/tests/pa1_tests/fail161.java b/miniJava/tests/pa1_tests/fail161.java new file mode 100644 index 0000000..22416ab --- /dev/null +++ b/miniJava/tests/pa1_tests/fail161.java @@ -0,0 +1,8 @@ +// PA1 parse decl fail +class Test { + + void p() { + boolean [] a = b; + } +} + diff --git a/miniJava/tests/pa1_tests/fail162.java b/miniJava/tests/pa1_tests/fail162.java new file mode 100644 index 0000000..f4bc9f8 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail162.java @@ -0,0 +1,8 @@ +// PA1 parse call fail +class Test { + + void p(int a, boolean b) { + int p(a,b); + } +} + diff --git a/miniJava/tests/pa1_tests/fail163.java b/miniJava/tests/pa1_tests/fail163.java new file mode 100644 index 0000000..1d8c0ee --- /dev/null +++ b/miniJava/tests/pa1_tests/fail163.java @@ -0,0 +1,8 @@ +// PA1 parse decl fail +class Test { + + void p(int a) { + Test [ ] x.y = a; + } +} + diff --git a/miniJava/tests/pa1_tests/fail164.java b/miniJava/tests/pa1_tests/fail164.java new file mode 100644 index 0000000..80a6bf1 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail164.java @@ -0,0 +1,8 @@ +// PA1 parse assign fail +class Test { + + void p(int a) { + Test [ ] = a * 3; + } +} + diff --git a/miniJava/tests/pa1_tests/fail165.java b/miniJava/tests/pa1_tests/fail165.java new file mode 100644 index 0000000..037c17c --- /dev/null +++ b/miniJava/tests/pa1_tests/fail165.java @@ -0,0 +1,8 @@ +// PA1 parse call fail +class Test { + + void p(int a) { + c.p(2,3)[3] = 4; + } +} + diff --git a/miniJava/tests/pa1_tests/fail166.java b/miniJava/tests/pa1_tests/fail166.java new file mode 100644 index 0000000..6ca0d07 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail166.java @@ -0,0 +1,8 @@ +// PA1 parse assign fail +class Test { + + void p(int a) { + that.this = 4; + } +} + diff --git a/miniJava/tests/pa1_tests/fail167.java b/miniJava/tests/pa1_tests/fail167.java new file mode 100644 index 0000000..fd5425d --- /dev/null +++ b/miniJava/tests/pa1_tests/fail167.java @@ -0,0 +1,8 @@ +// PA1 parse assign fail +class Test { + + void p() { + x.y() = z; + } +} + diff --git a/miniJava/tests/pa1_tests/fail168.java b/miniJava/tests/pa1_tests/fail168.java new file mode 100644 index 0000000..2320941 --- /dev/null +++ b/miniJava/tests/pa1_tests/fail168.java @@ -0,0 +1,8 @@ +// PA1 parse decl fail +class Test { + + void p() { + c [] d b = new int[4]; + } +} + diff --git a/miniJava/tests/pa1_tests/fail169.java b/miniJava/tests/pa1_tests/fail169.java new file mode 100644 index 0000000..069c05f --- /dev/null +++ b/miniJava/tests/pa1_tests/fail169.java @@ -0,0 +1,8 @@ +// PA1 parse new fail +class Test { + + void p() { + x = new Foo(10); + } +} + diff --git a/miniJava/tests/pa1_tests/pass100.java b/miniJava/tests/pa1_tests/pass100.java new file mode 100644 index 0000000..8ecff32 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass100.java @@ -0,0 +1,2 @@ +class id {} + diff --git a/miniJava/tests/pa1_tests/pass101.java b/miniJava/tests/pa1_tests/pass101.java new file mode 100644 index 0000000..0a0a702 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass101.java @@ -0,0 +1,3 @@ +// PA1 lex id pass +class id {} + diff --git a/miniJava/tests/pa1_tests/pass102.java b/miniJava/tests/pa1_tests/pass102.java new file mode 100644 index 0000000..95a31f8 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass102.java @@ -0,0 +1,3 @@ +// PA1 lex id pass +class id_ {} + diff --git a/miniJava/tests/pa1_tests/pass103.java b/miniJava/tests/pa1_tests/pass103.java new file mode 100644 index 0000000..69023da --- /dev/null +++ b/miniJava/tests/pa1_tests/pass103.java @@ -0,0 +1,3 @@ +// PA1 lex id pass +class id_0_1__{} + diff --git a/miniJava/tests/pa1_tests/pass105.java b/miniJava/tests/pa1_tests/pass105.java new file mode 100644 index 0000000..ce66e25 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass105.java @@ -0,0 +1,3 @@ +// PA1 lex id pass +class Class{} + diff --git a/miniJava/tests/pa1_tests/pass110.java b/miniJava/tests/pa1_tests/pass110.java new file mode 100644 index 0000000..111e200 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass110.java @@ -0,0 +1,3 @@ +// PA1 lex comment pass +class // comment $$ followed by \r\n +id {} diff --git a/miniJava/tests/pa1_tests/pass113.java b/miniJava/tests/pa1_tests/pass113.java new file mode 100644 index 0000000..0e9fe63 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass113.java @@ -0,0 +1,2 @@ +// PA1 lex comment pass +class id {} // trailing comment terminated by \r\n diff --git a/miniJava/tests/pa1_tests/pass117.java b/miniJava/tests/pa1_tests/pass117.java new file mode 100644 index 0000000..bf6f9c0 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass117.java @@ -0,0 +1,3 @@ +// PA1 lex comment pass +class /* comment */ id {} + diff --git a/miniJava/tests/pa1_tests/pass118.java b/miniJava/tests/pa1_tests/pass118.java new file mode 100644 index 0000000..2b581d5 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass118.java @@ -0,0 +1,3 @@ +// PA1 lex comment pass +class /**/ id {} + diff --git a/miniJava/tests/pa1_tests/pass119.java b/miniJava/tests/pa1_tests/pass119.java new file mode 100644 index 0000000..8fb0ea7 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass119.java @@ -0,0 +1,3 @@ +// PA1 lex comment pass +class /*/**/ id {} + diff --git a/miniJava/tests/pa1_tests/pass120.java b/miniJava/tests/pa1_tests/pass120.java new file mode 100644 index 0000000..3fb77d1 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass120.java @@ -0,0 +1,3 @@ +// PA1 lex comment pass +class /*/$*/ id {} + diff --git a/miniJava/tests/pa1_tests/pass121.java b/miniJava/tests/pa1_tests/pass121.java new file mode 100644 index 0000000..c813852 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass121.java @@ -0,0 +1,8 @@ +// PA1 lex unop pass +class id { + void p(){ + int x = - b; + boolean y = !y; + } +} + diff --git a/miniJava/tests/pa1_tests/pass123.java b/miniJava/tests/pa1_tests/pass123.java new file mode 100644 index 0000000..73598f3 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass123.java @@ -0,0 +1,7 @@ +// PA1 lex unop pass +class id { + void p(){ + boolean x = !!!!!b; + } +} + diff --git a/miniJava/tests/pa1_tests/pass124.java b/miniJava/tests/pa1_tests/pass124.java new file mode 100644 index 0000000..33c7981 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass124.java @@ -0,0 +1,7 @@ +// PA1 lex unop pass +class id { + void p(){ + boolean x = 10 >- b; + } +} + diff --git a/miniJava/tests/pa1_tests/pass125.java b/miniJava/tests/pa1_tests/pass125.java new file mode 100644 index 0000000..6286286 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass125.java @@ -0,0 +1,7 @@ +// PA1 lex binop pass +class id { + void p(){ + int x = 1 + 2 * 3 / 4 > 5 >= 6 < 7 <= 8 != 9 && 0 || 1; + } +} + diff --git a/miniJava/tests/pa1_tests/pass126.java b/miniJava/tests/pa1_tests/pass126.java new file mode 100644 index 0000000..3708ab8 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass126.java @@ -0,0 +1,7 @@ +// PA1 lex binop pass +class id { + void p(){ + boolean x = true && false || x; + } +} + diff --git a/miniJava/tests/pa1_tests/pass127.java b/miniJava/tests/pa1_tests/pass127.java new file mode 100644 index 0000000..e4c2983 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass127.java @@ -0,0 +1,7 @@ +// PA1 lex unop pass +class id { + void p(){ + int y = --y; + } +} + diff --git a/miniJava/tests/pa1_tests/pass128.java b/miniJava/tests/pa1_tests/pass128.java new file mode 100644 index 0000000..f21b331 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass128.java @@ -0,0 +1,7 @@ +// PA1 lex unop pass +class id { + void p(){ + int x = b - - b; + } +} + diff --git a/miniJava/tests/pa1_tests/pass129.java b/miniJava/tests/pa1_tests/pass129.java new file mode 100644 index 0000000..fabfd63 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass129.java @@ -0,0 +1,7 @@ +// PA1 lex unop pass +class id { + void p(){ + int x = b - - - -b; + } +} + diff --git a/miniJava/tests/pa1_tests/pass130.java b/miniJava/tests/pa1_tests/pass130.java new file mode 100644 index 0000000..e69de29 diff --git a/miniJava/tests/pa1_tests/pass131.java b/miniJava/tests/pa1_tests/pass131.java new file mode 100644 index 0000000..4acb6dc --- /dev/null +++ b/miniJava/tests/pa1_tests/pass131.java @@ -0,0 +1,12 @@ +// PA1 lex whitespace including tab +class Test { + /* multiple comments between + */ + + // tokens + + /**//* is OK */ + + +} + diff --git a/miniJava/tests/pa1_tests/pass132.java b/miniJava/tests/pa1_tests/pass132.java new file mode 100644 index 0000000..89408eb --- /dev/null +++ b/miniJava/tests/pa1_tests/pass132.java @@ -0,0 +1,3 @@ +// PA1 lex comment pass +class // comment followed by \n only +id {} diff --git a/miniJava/tests/pa1_tests/pass133.java b/miniJava/tests/pa1_tests/pass133.java new file mode 100644 index 0000000..287861f --- /dev/null +++ b/miniJava/tests/pa1_tests/pass133.java @@ -0,0 +1,3 @@ +// PA1 lex comment pass +class // comment followed by \r only + id {} \ No newline at end of file diff --git a/miniJava/tests/pa1_tests/pass134.java b/miniJava/tests/pa1_tests/pass134.java new file mode 100644 index 0000000..83a0c2a --- /dev/null +++ b/miniJava/tests/pa1_tests/pass134.java @@ -0,0 +1,2 @@ +// PA1 lex comment pass +class id {} // trailing comment terminated by \r \ No newline at end of file diff --git a/miniJava/tests/pa1_tests/pass135.java b/miniJava/tests/pa1_tests/pass135.java new file mode 100644 index 0000000..60c3f1d --- /dev/null +++ b/miniJava/tests/pa1_tests/pass135.java @@ -0,0 +1,2 @@ +// PA1 lex comment pass +class id {} // trailing comment terminated by \n diff --git a/miniJava/tests/pa1_tests/pass136.java b/miniJava/tests/pa1_tests/pass136.java new file mode 100644 index 0000000..216cd0c --- /dev/null +++ b/miniJava/tests/pa1_tests/pass136.java @@ -0,0 +1,2 @@ +// PA1 lex comment pass +class id {} // unterminated comment - no trailing \r\n \ No newline at end of file diff --git a/miniJava/tests/pa1_tests/pass137.java b/miniJava/tests/pa1_tests/pass137.java new file mode 100644 index 0000000..20cc7a7 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass137.java @@ -0,0 +1,2 @@ +// PA1 lex comment pass +class id {} /* no trailing \r\n */ \ No newline at end of file diff --git a/miniJava/tests/pa1_tests/pass140.java b/miniJava/tests/pa1_tests/pass140.java new file mode 100644 index 0000000..3ff1b0f --- /dev/null +++ b/miniJava/tests/pa1_tests/pass140.java @@ -0,0 +1,5 @@ +// PA1 parse field decl pass +class id { + public static Type x; +} + diff --git a/miniJava/tests/pa1_tests/pass141.java b/miniJava/tests/pa1_tests/pass141.java new file mode 100644 index 0000000..88a514b --- /dev/null +++ b/miniJava/tests/pa1_tests/pass141.java @@ -0,0 +1,5 @@ +// PA1 parse field decl pass +class id { + private static Type x; +} + diff --git a/miniJava/tests/pa1_tests/pass142.java b/miniJava/tests/pa1_tests/pass142.java new file mode 100644 index 0000000..396053c --- /dev/null +++ b/miniJava/tests/pa1_tests/pass142.java @@ -0,0 +1,5 @@ +// PA1 parse field decl pass +class id { + static Type x; +} + diff --git a/miniJava/tests/pa1_tests/pass143.java b/miniJava/tests/pa1_tests/pass143.java new file mode 100644 index 0000000..c9845b8 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass143.java @@ -0,0 +1,5 @@ +// PA1 parse field decl pass +class id { + Type x; +} + diff --git a/miniJava/tests/pa1_tests/pass144.java b/miniJava/tests/pa1_tests/pass144.java new file mode 100644 index 0000000..e86d303 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass144.java @@ -0,0 +1,5 @@ +// PA1 parse field decl pass +class id { + int x; +} + diff --git a/miniJava/tests/pa1_tests/pass145.java b/miniJava/tests/pa1_tests/pass145.java new file mode 100644 index 0000000..ab3e569 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass145.java @@ -0,0 +1,5 @@ +// PA1 parse field decl pass +class id { + int[] x; +} + diff --git a/miniJava/tests/pa1_tests/pass146.java b/miniJava/tests/pa1_tests/pass146.java new file mode 100644 index 0000000..50645d1 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass146.java @@ -0,0 +1,5 @@ +// PA1 parse field decl pass +class id { + static void x; +} + diff --git a/miniJava/tests/pa1_tests/pass147.java b/miniJava/tests/pa1_tests/pass147.java new file mode 100644 index 0000000..ce969d7 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass147.java @@ -0,0 +1,5 @@ +// PA1 parse method decl pass +class id { + public static void main(String[] args){} +} + diff --git a/miniJava/tests/pa1_tests/pass148.java b/miniJava/tests/pa1_tests/pass148.java new file mode 100644 index 0000000..a8a1967 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass148.java @@ -0,0 +1,5 @@ +// PA1 parse method decl pass +class id { + private int f(int x, boolean b) {return 3;} +} + diff --git a/miniJava/tests/pa1_tests/pass150.java b/miniJava/tests/pa1_tests/pass150.java new file mode 100644 index 0000000..6fa11df --- /dev/null +++ b/miniJava/tests/pa1_tests/pass150.java @@ -0,0 +1,9 @@ +// PA1 parse classdecls pass +class MainClass { + public static void main (String [] args) {} +} + +class OfItsOwn { + int A_01; +} // class OfItsOwn + diff --git a/miniJava/tests/pa1_tests/pass151.java b/miniJava/tests/pa1_tests/pass151.java new file mode 100644 index 0000000..3bf67e0 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass151.java @@ -0,0 +1,20 @@ +// PA1 parse identifiers pass +class Keywords { + + // minijava keywords are lower case only + void p() { + int format = while_1; + int Int = New; + For = Class; + FOR = RETURN; + } + + public int declare () { + boolean iF = true; + boolean Then = false; + boolean else1 = false; + + if (true == false) { else1 = iF == Then; } + } +} + diff --git a/miniJava/tests/pa1_tests/pass152.java b/miniJava/tests/pa1_tests/pass152.java new file mode 100644 index 0000000..858bbbd --- /dev/null +++ b/miniJava/tests/pa1_tests/pass152.java @@ -0,0 +1,8 @@ +// PA1 parse new pass +class MainClass { + public static void main (String [] args) { + SecondSubClass newobj = new SecondSubClass (); + } +} + + diff --git a/miniJava/tests/pa1_tests/pass153.java b/miniJava/tests/pa1_tests/pass153.java new file mode 100644 index 0000000..91330f4 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass153.java @@ -0,0 +1,8 @@ +// PA1 parse new pass +class Foo { + void bar() { + int[] newarr = new int[20]; + } +} + + diff --git a/miniJava/tests/pa1_tests/pass154.java b/miniJava/tests/pa1_tests/pass154.java new file mode 100644 index 0000000..3328ef7 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass154.java @@ -0,0 +1,23 @@ +// PA1 parse methods pass +class MainClass { + public static void main (String [] args) { + } +} +class SuperClass +{ + public void setWorth (int worth){ + integer = worth; + } + + public int getWorth (){ + return this.integer; + } + + public void setTruth (boolean truth){ + bool = truth; + } + + public int getTruth (){ + return this.bool; + } +} diff --git a/miniJava/tests/pa1_tests/pass155.java b/miniJava/tests/pa1_tests/pass155.java new file mode 100644 index 0000000..3453fc6 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass155.java @@ -0,0 +1,21 @@ +// PA1 parse parse pass +class MainClass { + public static void main (String [] args) { + SecondSubClass newobj = new SecondSubClass (); + } +} +class SuperClass +{ + private void fillup (boolean open, int [] jar, int marble, int upto) { + + int index = 0; + if (open == true) { + while ( index < upto ) { + ownjar [index] = jar [index]; + jar [index] = marble; + } // while + } // if + } // fillup + +} // class SuperClass + diff --git a/miniJava/tests/pa1_tests/pass158.java b/miniJava/tests/pa1_tests/pass158.java new file mode 100644 index 0000000..be52ebf --- /dev/null +++ b/miniJava/tests/pa1_tests/pass158.java @@ -0,0 +1,12 @@ +// PA1 parse refs pass +class Test { + + void p() { + a = true; + a [b] = c; + p (); + a.b[3] = d; + c.p(e); + } +} + diff --git a/miniJava/tests/pa1_tests/pass159.java b/miniJava/tests/pa1_tests/pass159.java new file mode 100644 index 0000000..9d6a140 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass159.java @@ -0,0 +1,11 @@ +// PA1 parse decl pass +class Test { + + int [] a; + Test [] t; + + void p() { + void x = this.t[3].a[4].p(); + } +} + diff --git a/miniJava/tests/pa1_tests/pass160.java b/miniJava/tests/pa1_tests/pass160.java new file mode 100644 index 0000000..82d7f6b --- /dev/null +++ b/miniJava/tests/pa1_tests/pass160.java @@ -0,0 +1,9 @@ +// PA1 parse refs pass +class Test { + + void p() { + A a = 23; + boolean b = c; + } +} + diff --git a/miniJava/tests/pa1_tests/pass161.java b/miniJava/tests/pa1_tests/pass161.java new file mode 100644 index 0000000..654e776 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass161.java @@ -0,0 +1,8 @@ +// PA1 parse assign pass +class Test { + + void p() { + a = b; + } +} + diff --git a/miniJava/tests/pa1_tests/pass162.java b/miniJava/tests/pa1_tests/pass162.java new file mode 100644 index 0000000..77d1a46 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass162.java @@ -0,0 +1,8 @@ +// PA1 parse call pass +class Test { + + void p(int a, boolean b) { + p(a,b); + } +} + diff --git a/miniJava/tests/pa1_tests/pass163.java b/miniJava/tests/pa1_tests/pass163.java new file mode 100644 index 0000000..402f02b --- /dev/null +++ b/miniJava/tests/pa1_tests/pass163.java @@ -0,0 +1,8 @@ +// PA1 parse decl pass +class Test { + + void p(int a) { + Test [ ] v = a; + } +} + diff --git a/miniJava/tests/pa1_tests/pass164.java b/miniJava/tests/pa1_tests/pass164.java new file mode 100644 index 0000000..3ef2c2b --- /dev/null +++ b/miniJava/tests/pa1_tests/pass164.java @@ -0,0 +1,8 @@ +// PA1 parse assign pass +class Test { + + void p(int a) { + Test [ a + 1] = a * 3; + } +} + diff --git a/miniJava/tests/pa1_tests/pass165.java b/miniJava/tests/pa1_tests/pass165.java new file mode 100644 index 0000000..e95b29c --- /dev/null +++ b/miniJava/tests/pa1_tests/pass165.java @@ -0,0 +1,9 @@ +// PA1 parse call pass +class Test { + + void p(int a) { + C c = new C(); + c.p(2,3); + } +} + diff --git a/miniJava/tests/pa1_tests/pass166.java b/miniJava/tests/pa1_tests/pass166.java new file mode 100644 index 0000000..ed777be --- /dev/null +++ b/miniJava/tests/pa1_tests/pass166.java @@ -0,0 +1,9 @@ +// PA1 parse assign pass +class Test { + + void p(int a) { + this.p(2,3); + a.v[3] = 4; + } +} + diff --git a/miniJava/tests/pa1_tests/pass167.java b/miniJava/tests/pa1_tests/pass167.java new file mode 100644 index 0000000..8da8f55 --- /dev/null +++ b/miniJava/tests/pa1_tests/pass167.java @@ -0,0 +1,8 @@ +// PA1 parse assign pass +class Test { + + void p() { + x.y = z; + } +} + diff --git a/miniJava/tests/pa1_tests/pass168.java b/miniJava/tests/pa1_tests/pass168.java new file mode 100644 index 0000000..716d68c --- /dev/null +++ b/miniJava/tests/pa1_tests/pass168.java @@ -0,0 +1,9 @@ +// PA1 parse decl pass +class Test { + + void p() { + int a = 3; + int [] b = new int[4]; + } +} + diff --git a/miniJava/tests/pa1_tests/pass169.java b/miniJava/tests/pa1_tests/pass169.java new file mode 100644 index 0000000..37fafdd --- /dev/null +++ b/miniJava/tests/pa1_tests/pass169.java @@ -0,0 +1,8 @@ +// PA1 parse new pass +class Test { + + void p() { + Foo [] foo = new Foo [10]; + } +} + diff --git a/miniJava/tests/src/tester/Checkpoint1.java b/miniJava/tests/src/tester/Checkpoint1.java new file mode 100644 index 0000000..ffa95d6 --- /dev/null +++ b/miniJava/tests/src/tester/Checkpoint1.java @@ -0,0 +1,71 @@ +package tester; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Scanner; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/* Automated regression tester for Checkpoint 1 tests + * Created by Max Beckman-Harned + * Put your tests in "tests/pa1_tests" folder in your Eclipse workspace directory + */ +public class Checkpoint1 { + + static ExecutorService threadPool = Executors.newCachedThreadPool(); + + public static void main(String[] args) throws IOException, InterruptedException { + File testDir = new File(System.getProperty("java.class.path") + "/../tests/pa1_tests"); + System.out.println(System.getProperty("java.class.path")); + int failures = 0; + for (File x : testDir.listFiles()) { + int returnCode = runTest(x); + if (x.getName().indexOf("pass") != -1) { + if (returnCode == 0) + System.out.println(x.getName() + " passed successfully!"); + else { + failures++; + System.err.println(x.getName() + + " failed but should have passed!"); + } + } else { + if (returnCode == 4) + System.out.println(x.getName() + " failed successfully!"); + else { + System.err.println(x.getName() + " did not fail properly!"); + failures++; + } + } + } + System.out.println(failures + " failures in all."); + } + + private static int runTest(File x) throws IOException, InterruptedException { + ProcessBuilder pb = new ProcessBuilder("java", "miniJava.Compiler", x.getPath()).directory(new File(System.getProperty("java.class.path"))); + Process p = pb.start(); + threadPool.execute(new ProcessOutputter(p.getInputStream(), false)); + p.waitFor(); + return p.exitValue(); + } + + static class ProcessOutputter implements Runnable { + private Scanner processOutput; + private boolean output; + + public ProcessOutputter(InputStream _processStream, boolean _output) { + processOutput = new Scanner(_processStream); + output = _output; + } + @Override + public void run() { + while(processOutput.hasNextLine()) { + String line = processOutput.nextLine(); + if (output) + System.out.println(line); + } + } + + + } +} diff --git a/miniJava/tests/test.java b/miniJava/tests/test.java new file mode 100644 index 0000000..33c7981 --- /dev/null +++ b/miniJava/tests/test.java @@ -0,0 +1,7 @@ +// PA1 lex unop pass +class id { + void p(){ + boolean x = 10 >- b; + } +} +