From fcded3e35134f595f0c922f1037cb26493350157 Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Thu, 27 Mar 2025 21:10:45 +0000 Subject: [PATCH 01/21] Setting up GitHub Classroom Feedback From a81700826be59f9dc742f8461c5955df4efc0dfc Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Thu, 27 Mar 2025 21:10:47 +0000 Subject: [PATCH 02/21] add online IDE url; add deadline --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 3f72893..f6ba2ff 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![Review Assignment Due Date](https://classroom.github.com/assets/deadline-readme-button-22041afd0340ce965d47ae6ef1cefeee28c7c493a6346c4f15d667ab976d596c.svg)](https://classroom.github.com/a/4nHL7_6-) +[![Open in Visual Studio Code](https://classroom.github.com/assets/open-in-vscode-2e0aaae1b6195c2367325f4f02e2d04e9abb55f0b24a779b69b11b9e10269abc.svg)](https://classroom.github.com/online_ide?assignment_repo_id=18897626&assignment_repo_type=AssignmentRepo) # CS 164: Programming Assignment 1 [PA1 Specification]: https://drive.google.com/open?id=1oYcJ5iv7Wt8oZNS1bEfswAklbMxDtwqB From eeb915d9b3b5224080a8aeef7fe557447716b787 Mon Sep 17 00:00:00 2001 From: Elihofni Date: Mon, 31 Mar 2025 10:12:10 -0300 Subject: [PATCH 03/21] docs: add team member names --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f6ba2ff..533c2f2 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ See the [PA1 specification][] on the course website for a detailed specification of the assignment. Refer to the [ChocoPy Specification][] on the CS164 web site -for the specification of the ChocoPy language. +for the specification of the ChocoPy language. ## Receiving updates to this repository @@ -48,8 +48,10 @@ To sync with updates upstream: ## Submission writeup -Team member 1: +Team member 1: Elihofni Guirra Lima -Team member 2: +Team member 2: Henrique de Morais Porto + +Team member 3: Marco de Sousa Melo (Students should edit this section with their write-up) From 5898b70ebf0a877604f565755cf039bdd773e7ff Mon Sep 17 00:00:00 2001 From: Henrique Porto Date: Tue, 8 Apr 2025 11:54:15 -0300 Subject: [PATCH 04/21] analisador lexico (init) --- src/main/jflex/chocopy/pa1/ChocoPy.jflex | 127 +++++++++++++++++++++-- 1 file changed, 117 insertions(+), 10 deletions(-) diff --git a/src/main/jflex/chocopy/pa1/ChocoPy.jflex b/src/main/jflex/chocopy/pa1/ChocoPy.jflex index 9aafe7f..4718ca8 100644 --- a/src/main/jflex/chocopy/pa1/ChocoPy.jflex +++ b/src/main/jflex/chocopy/pa1/ChocoPy.jflex @@ -57,26 +57,133 @@ LineBreak = \r|\n|\r\n IntegerLiteral = 0 | [1-9][0-9]* +DoubleQuote = \" +Backslash = \\ +/* +Segundo ao item 3.4.1 da documentação, são aceitos os caracteres ASCII: [32-126, menos \ e "] +32 = \u0020 +126 = \u007E +\ = \u0022 +" = \u005C +*/ +AsciiChar = [\u0020-\u0021\u0023-\u005B\u005D-\u007E] + +/* +Ainda no item 3.4.1 da documentação, são aceitos somente as seguintes sequencias de escape: +\" = double quote +\n = newline +\t = tab +\\ = backslash +*/ +EscapedChar = {Backslash}([\"nt\\]) + +/* +Juntando temos a StringLiteral. +*/ +StringLiteral = {DoubleQuote}({AsciiChar}|{EscapedChar})*{DoubleQuote} + +/* +Identifier: o nome de variavel ou função +*/ +IdString = [_a-zA-Z][_a-z0-9A-Z]* + +/* FALTA: +- Comments +- NEWLINE, INDENT, DEDENT (usar variavel global, entender melhor no item 3.1.5). +*/ + %% { - /* Delimiters. */ - {LineBreak} { return symbol(ChocoPyTokens.NEWLINE); } - - /* Literals. */ - {IntegerLiteral} { return symbol(ChocoPyTokens.NUMBER, - Integer.parseInt(yytext())); } - - /* Operators. */ - "+" { return symbol(ChocoPyTokens.PLUS, yytext()); } + /* Delimiters */ + {LineBreak} { return symbol(ChocoPyTokens.NEWLINE); } + + /* Operators (item 3.5 da documentação) */ + /* + - * // % < > <= >= == != = ( ) [ ] , : . -> */ + "+" { return symbol(ChocoPyTokens.PLUS); } + "-" { return symbol(ChocoPyTokens.MINUS); } + "*" { return symbol(ChocoPyTokens.STAR); } + "//" { return symbol(ChocoPyTokens.DOUBLE_SLASH); } + "%" { return symbol(ChocoPyTokens.PERCENT); } + "<" { return symbol(ChocoPyTokens.LESS_THAN); } + ">" { return symbol(ChocoPyTokens.GREATER_THAN); } + "<=" { return symbol(ChocoPyTokens.LESS_THAN_EQUAL); } + ">=" { return symbol(ChocoPyTokens.GREATER_THAN_EQUAL); } + "==" { return symbol(ChocoPyTokens.EQUAL_EQUAL); } + "!=" { return symbol(ChocoPyTokens.NOT_EQUAL); } + "=" { return symbol(ChocoPyTokens.ASSIGN); } + "(" { return symbol(ChocoPyTokens.LEFT_PAREN); } + ")" { return symbol(ChocoPyTokens.RIGHT_PAREN); } + "[" { return symbol(ChocoPyTokens.LEFT_BRACKET); } + "]" { return symbol(ChocoPyTokens.RIGHT_BRACKET); } + "," { return symbol(ChocoPyTokens.COMMA); } + ":" { return symbol(ChocoPyTokens.COLON); } + "." { return symbol(ChocoPyTokens.DOT); } + "->" { return symbol(ChocoPyTokens.ARROW); } /* Whitespace. */ - {WhiteSpace} { /* ignore */ } + {WhiteSpace} { /* ignore */ } + + /* TODO Keywords (item 3.3 da documentação) */ + "False" { return symbol(ChocoPyTokens.FALSE); } + "None" { return symbol(ChocoPyTokens.NONE); } + "True" { return symbol(ChocoPyTokens.TRUE); } + "and" { return symbol(ChocoPyTokens.AND); } + "as" { return symbol(ChocoPyTokens.AS); } + "assert" { return symbol(ChocoPyTokens.ASSERT); } + "async" { return symbol(ChocoPyTokens.ASYNC); } + "await" { return symbol(ChocoPyTokens.AWAIT); } + "break" { return symbol(ChocoPyTokens.BREAK); } + "class" { return symbol(ChocoPyTokens.CLASS); } + "continue" { return symbol(ChocoPyTokens.CONTINUE); } + "def" { return symbol(ChocoPyTokens.DEF); } + "del" { return symbol(ChocoPyTokens.DEL); } + "elif" { return symbol(ChocoPyTokens.ELIF); } + "else" { return symbol(ChocoPyTokens.ELSE); } + "except" { return symbol(ChocoPyTokens.EXCEPT); } + "finally" { return symbol(ChocoPyTokens.FINALLY); } + "for" { return symbol(ChocoPyTokens.FOR); } + "from" { return symbol(ChocoPyTokens.FROM); } + "global" { return symbol(ChocoPyTokens.GLOBAL); } + "if" { return symbol(ChocoPyTokens.IF); } + "import" { return symbol(ChocoPyTokens.IMPORT); } + "in" { return symbol(ChocoPyTokens.IN); } + "is" { return symbol(ChocoPyTokens.IS); } + "lambda" { return symbol(ChocoPyTokens.LAMBDA); } + "nonlocal" { return symbol(ChocoPyTokens.NONLOCAL); } + "not" { return symbol(ChocoPyTokens.NOT); } + "or" { return symbol(ChocoPyTokens.OR); } + "pass" { return symbol(ChocoPyTokens.PASS); } + "raise" { return symbol(ChocoPyTokens.RAISE); } + "return" { return symbol(ChocoPyTokens.RETURN); } + "try" { return symbol(ChocoPyTokens.TRY); } + "while" { return symbol(ChocoPyTokens.WHILE); } + "with" { return symbol(ChocoPyTokens.WITH); } + "yield" { return symbol(ChocoPyTokens.YIELD); } + + /* + Literal: to denote a constant literal such as an integer literal, a string literal. + */ + {IntegerLiteral} { return symbol(ChocoPyTokens.NUMBER, Integer.parseInt(yytext())); } + {StringLiteral} { return symbol(ChocoPyTokens.STRING, yytext()); } + + /* Identifiers */ + {IdString} { return symbol(ChocoPyTokens.IDENTIFIER, yytext()); } + } <> { return symbol(ChocoPyTokens.EOF); } /* Error fallback. */ [^] { return symbol(ChocoPyTokens.UNRECOGNIZED); } + + +/* +links importantes: +https://jflex.de/manual.html +https://classroom.google.com/c/NzU5OTA0OTQ1NDA1/m/NzU5OTM1NTExMzk2/details +https://docs.google.com/document/d/1wqPQzb4nLzOB8LDCB8lRMzFOSLDb0n4tsnLgZQOu8AY/edit?tab=t.0 +https://github.com/compilers-uff/lexer-e-parser-grupo-13 +*/ \ No newline at end of file From 24b4700407585b2bff9c5365baac4818d82d6f1f Mon Sep 17 00:00:00 2001 From: Elihofni Date: Wed, 9 Apr 2025 08:51:44 -0300 Subject: [PATCH 05/21] feat: add comment regex to jflex --- src/main/jflex/chocopy/pa1/ChocoPy.jflex | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/jflex/chocopy/pa1/ChocoPy.jflex b/src/main/jflex/chocopy/pa1/ChocoPy.jflex index 4718ca8..c700e99 100644 --- a/src/main/jflex/chocopy/pa1/ChocoPy.jflex +++ b/src/main/jflex/chocopy/pa1/ChocoPy.jflex @@ -87,8 +87,12 @@ Identifier: o nome de variavel ou função */ IdString = [_a-zA-Z][_a-z0-9A-Z]* -/* FALTA: -- Comments +/* +Comment: Comentário de linha única (sem multiline) -> python regex equivalent -> (?P#.*#) +*/ +Comment = #.*# + +/* TODO - NEWLINE, INDENT, DEDENT (usar variavel global, entender melhor no item 3.1.5). */ From 7a664415b4d4857282a03b7bf5227aa8e39f7536 Mon Sep 17 00:00:00 2001 From: Marco de Sousa Date: Wed, 9 Apr 2025 08:56:05 -0300 Subject: [PATCH 06/21] newlines, indent e dedent --- src/main/jflex/chocopy/pa1/ChocoPy.jflex | 99 ++++++++++++++++++++++-- 1 file changed, 93 insertions(+), 6 deletions(-) diff --git a/src/main/jflex/chocopy/pa1/ChocoPy.jflex b/src/main/jflex/chocopy/pa1/ChocoPy.jflex index 4718ca8..d13e816 100644 --- a/src/main/jflex/chocopy/pa1/ChocoPy.jflex +++ b/src/main/jflex/chocopy/pa1/ChocoPy.jflex @@ -16,6 +16,8 @@ import java_cup.runtime.*; %cup %cupdebug +%state LINE_START + %eofclose false /*** Do not change the flags above unless you know what you are doing. ***/ @@ -47,6 +49,26 @@ import java_cup.runtime.*; new ComplexSymbolFactory.Location(yyline + 1,yycolumn + yylength()), value); } + /*inicio da pilha de indentação no nivel zero*/ + private java.util.Stack indentStack = new java.util.Stack<>(); + private int pendingDedents = 0; + private boolean emitNewline = false; + private boolean startOfLine = true; + + { + indentStack.push(0); + } + /* contador de whitespaces no inicio da linha*/ + private int computeIndentation(String line) { + int count = 0; + for (int i = 0; i < line.length(); i++) { + char c = line.charAt(i); + if (c == ' ') count++; + else if (c == '\t') count += 8 - (count % 8); + else break; + } + return count; + } %} @@ -96,10 +118,21 @@ IdString = [_a-zA-Z][_a-z0-9A-Z]* { + // Gera dedents pendentes + if (pendingDedents > 0) { + pendingDedents--; + return symbol(ChocoPyTokens.DEDENT); + } + /* Whitespace. */ + {WhiteSpace} { /* ignore */ } - /* Delimiters */ - {LineBreak} { return symbol(ChocoPyTokens.NEWLINE); } - + /* Delimiters */ + {LineBreak} { + emitNewline = true; + startOfLine = true; + yybegin(LINE_START); + } + /* Operators (item 3.5 da documentação) */ /* + - * // % < > <= >= == != = ( ) [ ] , : . -> */ "+" { return symbol(ChocoPyTokens.PLUS); } @@ -123,8 +156,6 @@ IdString = [_a-zA-Z][_a-z0-9A-Z]* "." { return symbol(ChocoPyTokens.DOT); } "->" { return symbol(ChocoPyTokens.ARROW); } - /* Whitespace. */ - {WhiteSpace} { /* ignore */ } /* TODO Keywords (item 3.3 da documentação) */ "False" { return symbol(ChocoPyTokens.FALSE); } @@ -173,8 +204,64 @@ IdString = [_a-zA-Z][_a-z0-9A-Z]* {IdString} { return symbol(ChocoPyTokens.IDENTIFIER, yytext()); } } + { + {WhiteSpace}* { + String indentText = yytext(); + int currentIndent = computeIndentation(indentText); + + int lookahead; + try { + lookahead = yycharat(yylength()); + } catch (Exception e) { + lookahead = -1; + } + // Leia o próximo caractere para ver se a linha é vazia/comentário + if (lookahead == '#' || lookahead == '\n' || lookahead == '\r' || lookahead == -1) { + startOfLine = false; + yybegin(YYINITIAL); + } else { + int prevIndent = indentStack.peek(); + if (currentIndent == prevIndent) { + if (emitNewline) { + emitNewline = false; + yybegin(YYINITIAL); + return symbol(ChocoPyTokens.NEWLINE); + } + yybegin(YYINITIAL); + } else if (currentIndent > prevIndent) { + indentStack.push(currentIndent); + yybegin(YYINITIAL); + return symbol(ChocoPyTokens.INDENT); + } else { + pendingDedents = 0; + while (indentStack.peek() > currentIndent) { + indentStack.pop(); + pendingDedents++; + } + if (indentStack.peek() != currentIndent) { + throw new Error("Indentation Error"); + } + if (emitNewline) { + emitNewline = false; + return symbol(ChocoPyTokens.NEWLINE); + } + if (pendingDedents > 0) { + pendingDedents--; + return symbol(ChocoPyTokens.DEDENT); + } + yybegin(YYINITIAL); + } + } + } +} -<> { return symbol(ChocoPyTokens.EOF); } +<> { + while (indentStack.size() > 1) { + indentStack.pop(); + return symbol(ChocoPyTokens.DEDENT); + } + return symbol(ChocoPyTokens.EOF); +} /* Error fallback. */ [^] { return symbol(ChocoPyTokens.UNRECOGNIZED); } From b693d171d60d0d5ca193def5cc86f511752bf266 Mon Sep 17 00:00:00 2001 From: Elihofni Date: Wed, 9 Apr 2025 09:39:43 -0300 Subject: [PATCH 07/21] fix: cup --- src/main/cup/chocopy/pa1/ChocoPy.cup | 77 ++++++++++++++- src/main/jflex/chocopy/pa1/ChocoPy.jflex | 120 +++++++++++------------ 2 files changed, 134 insertions(+), 63 deletions(-) diff --git a/src/main/cup/chocopy/pa1/ChocoPy.cup b/src/main/cup/chocopy/pa1/ChocoPy.cup index d4ff444..380d9b7 100644 --- a/src/main/cup/chocopy/pa1/ChocoPy.cup +++ b/src/main/cup/chocopy/pa1/ChocoPy.cup @@ -143,11 +143,82 @@ action code {: * in actions ( {: ... :} ). */ terminal NEWLINE; -terminal String PLUS; -terminal Integer NUMBER; + +/* Errors */ /* Returned by the lexer for erroneous tokens. Since it does not appear in * the grammar, it indicates a syntax error. */ -terminal UNRECOGNIZED; +terminal UNRECOGNIZED; +terminal INTEGER_OVERFLOW_LEXICAL_ERROR; + +/* Keywords. */ +terminal String FALSE; +terminal String NONE; +terminal String TRUE; +terminal String AND; +terminal String AS; +terminal String ASSERT; +terminal String ASYNC; +terminal String AWAIT; +terminal String BREAK; +terminal String CLASS; +terminal String CONTINUE; +terminal String DEF; +terminal String DEL; +terminal String ELIF; +terminal String ELSE; +terminal String EXCEPT; +terminal String FINALLY; +terminal String FOR; +terminal String FROM; +terminal String GLOBAL; +terminal String IF; +terminal String IMPORT; +terminal String IN; +terminal String IS; +terminal String LAMBDA; +terminal String NONLOCAL; +terminal String NOT; +terminal String OR; +terminal String PASS; +terminal String RAISE; +terminal String RETURN; +terminal String TRY; +terminal String WHILE; +terminal String WITH; +terminal String YIELD; +terminal String INDENT; // FIXME Validar se está na categoria correta +terminal String DEDENT; // FIXME Validar se está na categoria correta + +/* Literals. */ +terminal Integer NUMBER; +terminal String IDSTRING; +terminal String STRING; + +/* Operators. */ +terminal String PLUS; +terminal String MINUS; +terminal String STAR; +terminal String DOUBLE_SLASH; +terminal String PERCENT; +terminal String LESS_THAN; +terminal String GREATER_THAN; +terminal String LESS_THAN_EQUAL; +terminal String GREATER_THAN_EQUAL; +terminal String EQUAL_EQUAL; +terminal String NOT_EQUALS; +terminal String ASSIGN; +terminal String LEFT_PAREN; +terminal String RIGHT_PAREN; +terminal String LEFT_BRACKET; +terminal String RIGHT_BRACKET; +terminal String COMMA; +terminal String COLON; +terminal String DOT; +terminal String RIGHT_ARROW; + +/* Identifiers. */ +terminal String IDENTIFIER; + /* Nonterminal symbols (defined in production rules below). * As for terminal symbols, diff --git a/src/main/jflex/chocopy/pa1/ChocoPy.jflex b/src/main/jflex/chocopy/pa1/ChocoPy.jflex index 0aaebef..86870b3 100644 --- a/src/main/jflex/chocopy/pa1/ChocoPy.jflex +++ b/src/main/jflex/chocopy/pa1/ChocoPy.jflex @@ -137,66 +137,66 @@ Comment = #.*# yybegin(LINE_START); } - /* Operators (item 3.5 da documentação) */ - /* + - * // % < > <= >= == != = ( ) [ ] , : . -> */ - "+" { return symbol(ChocoPyTokens.PLUS); } - "-" { return symbol(ChocoPyTokens.MINUS); } - "*" { return symbol(ChocoPyTokens.STAR); } - "//" { return symbol(ChocoPyTokens.DOUBLE_SLASH); } - "%" { return symbol(ChocoPyTokens.PERCENT); } - "<" { return symbol(ChocoPyTokens.LESS_THAN); } - ">" { return symbol(ChocoPyTokens.GREATER_THAN); } - "<=" { return symbol(ChocoPyTokens.LESS_THAN_EQUAL); } - ">=" { return symbol(ChocoPyTokens.GREATER_THAN_EQUAL); } - "==" { return symbol(ChocoPyTokens.EQUAL_EQUAL); } - "!=" { return symbol(ChocoPyTokens.NOT_EQUAL); } - "=" { return symbol(ChocoPyTokens.ASSIGN); } - "(" { return symbol(ChocoPyTokens.LEFT_PAREN); } - ")" { return symbol(ChocoPyTokens.RIGHT_PAREN); } - "[" { return symbol(ChocoPyTokens.LEFT_BRACKET); } - "]" { return symbol(ChocoPyTokens.RIGHT_BRACKET); } - "," { return symbol(ChocoPyTokens.COMMA); } - ":" { return symbol(ChocoPyTokens.COLON); } - "." { return symbol(ChocoPyTokens.DOT); } - "->" { return symbol(ChocoPyTokens.ARROW); } - - - /* TODO Keywords (item 3.3 da documentação) */ - "False" { return symbol(ChocoPyTokens.FALSE); } - "None" { return symbol(ChocoPyTokens.NONE); } - "True" { return symbol(ChocoPyTokens.TRUE); } - "and" { return symbol(ChocoPyTokens.AND); } - "as" { return symbol(ChocoPyTokens.AS); } - "assert" { return symbol(ChocoPyTokens.ASSERT); } - "async" { return symbol(ChocoPyTokens.ASYNC); } - "await" { return symbol(ChocoPyTokens.AWAIT); } - "break" { return symbol(ChocoPyTokens.BREAK); } - "class" { return symbol(ChocoPyTokens.CLASS); } - "continue" { return symbol(ChocoPyTokens.CONTINUE); } - "def" { return symbol(ChocoPyTokens.DEF); } - "del" { return symbol(ChocoPyTokens.DEL); } - "elif" { return symbol(ChocoPyTokens.ELIF); } - "else" { return symbol(ChocoPyTokens.ELSE); } - "except" { return symbol(ChocoPyTokens.EXCEPT); } - "finally" { return symbol(ChocoPyTokens.FINALLY); } - "for" { return symbol(ChocoPyTokens.FOR); } - "from" { return symbol(ChocoPyTokens.FROM); } - "global" { return symbol(ChocoPyTokens.GLOBAL); } - "if" { return symbol(ChocoPyTokens.IF); } - "import" { return symbol(ChocoPyTokens.IMPORT); } - "in" { return symbol(ChocoPyTokens.IN); } - "is" { return symbol(ChocoPyTokens.IS); } - "lambda" { return symbol(ChocoPyTokens.LAMBDA); } - "nonlocal" { return symbol(ChocoPyTokens.NONLOCAL); } - "not" { return symbol(ChocoPyTokens.NOT); } - "or" { return symbol(ChocoPyTokens.OR); } - "pass" { return symbol(ChocoPyTokens.PASS); } - "raise" { return symbol(ChocoPyTokens.RAISE); } - "return" { return symbol(ChocoPyTokens.RETURN); } - "try" { return symbol(ChocoPyTokens.TRY); } - "while" { return symbol(ChocoPyTokens.WHILE); } - "with" { return symbol(ChocoPyTokens.WITH); } - "yield" { return symbol(ChocoPyTokens.YIELD); } + /* Operators (item 3.5 da documentação) */ + /* + - * // % < > <= >= == != = ( ) [ ] , : . -> */ + "+" { return symbol(ChocoPyTokens.PLUS, yytext()); } + "-" { return symbol(ChocoPyTokens.MINUS, yytext()); } + "*" { return symbol(ChocoPyTokens.STAR, yytext()); } + "//" { return symbol(ChocoPyTokens.DOUBLE_SLASH, yytext()); } + "%" { return symbol(ChocoPyTokens.PERCENT, yytext()); } + "<" { return symbol(ChocoPyTokens.LESS_THAN, yytext()); } + ">" { return symbol(ChocoPyTokens.GREATER_THAN, yytext()); } + "<=" { return symbol(ChocoPyTokens.LESS_THAN_EQUAL, yytext()); } + ">=" { return symbol(ChocoPyTokens.GREATER_THAN_EQUAL, yytext()); } + "==" { return symbol(ChocoPyTokens.EQUAL_EQUAL, yytext()); } + "!=" { return symbol(ChocoPyTokens.NOT_EQUALS, yytext()); } + "=" { return symbol(ChocoPyTokens.ASSIGN, yytext()); } + "(" { return symbol(ChocoPyTokens.LEFT_PAREN, yytext()); } + ")" { return symbol(ChocoPyTokens.RIGHT_PAREN, yytext()); } + "[" { return symbol(ChocoPyTokens.LEFT_BRACKET, yytext()); } + "]" { return symbol(ChocoPyTokens.RIGHT_BRACKET, yytext()); } + "," { return symbol(ChocoPyTokens.COMMA, yytext()); } + ":" { return symbol(ChocoPyTokens.COLON, yytext()); } + "." { return symbol(ChocoPyTokens.DOT, yytext()); } + "->" { return symbol(ChocoPyTokens.RIGHT_ARROW, yytext()); } + + + /* TODO Keywords (item 3.3 da documentação) */ + "False" { return symbol(ChocoPyTokens.FALSE, yytext()); } + "None" { return symbol(ChocoPyTokens.NONE, yytext()); } + "True" { return symbol(ChocoPyTokens.TRUE, yytext()); } + "and" { return symbol(ChocoPyTokens.AND, yytext()); } + "as" { return symbol(ChocoPyTokens.AS, yytext()); } + "assert" { return symbol(ChocoPyTokens.ASSERT, yytext()); } + "async" { return symbol(ChocoPyTokens.ASYNC, yytext()); } + "await" { return symbol(ChocoPyTokens.AWAIT, yytext()); } + "break" { return symbol(ChocoPyTokens.BREAK, yytext()); } + "class" { return symbol(ChocoPyTokens.CLASS, yytext()); } + "continue" { return symbol(ChocoPyTokens.CONTINUE, yytext()); } + "def" { return symbol(ChocoPyTokens.DEF, yytext()); } + "del" { return symbol(ChocoPyTokens.DEL, yytext()); } + "elif" { return symbol(ChocoPyTokens.ELIF, yytext()); } + "else" { return symbol(ChocoPyTokens.ELSE, yytext()); } + "except" { return symbol(ChocoPyTokens.EXCEPT, yytext()); } + "finally" { return symbol(ChocoPyTokens.FINALLY, yytext()); } + "for" { return symbol(ChocoPyTokens.FOR, yytext()); } + "from" { return symbol(ChocoPyTokens.FROM, yytext()); } + "global" { return symbol(ChocoPyTokens.GLOBAL, yytext()); } + "if" { return symbol(ChocoPyTokens.IF, yytext()); } + "import" { return symbol(ChocoPyTokens.IMPORT, yytext()); } + "in" { return symbol(ChocoPyTokens.IN, yytext()); } + "is" { return symbol(ChocoPyTokens.IS, yytext()); } + "lambda" { return symbol(ChocoPyTokens.LAMBDA, yytext()); } + "nonlocal" { return symbol(ChocoPyTokens.NONLOCAL, yytext()); } + "not" { return symbol(ChocoPyTokens.NOT, yytext()); } + "or" { return symbol(ChocoPyTokens.OR, yytext()); } + "pass" { return symbol(ChocoPyTokens.PASS, yytext()); } + "raise" { return symbol(ChocoPyTokens.RAISE, yytext()); } + "return" { return symbol(ChocoPyTokens.RETURN, yytext()); } + "try" { return symbol(ChocoPyTokens.TRY, yytext()); } + "while" { return symbol(ChocoPyTokens.WHILE, yytext()); } + "with" { return symbol(ChocoPyTokens.WITH, yytext()); } + "yield" { return symbol(ChocoPyTokens.YIELD, yytext()); } /* Literal: to denote a constant literal such as an integer literal, a string literal. From 5ccebd62d037567417cbb3ffcab40b310134cfe7 Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Wed, 9 Apr 2025 13:16:22 +0000 Subject: [PATCH 08/21] GitHub Classroom Autograding Workflow --- .github/workflows/classroom.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/classroom.yml b/.github/workflows/classroom.yml index e7c2a76..b794a38 100644 --- a/.github/workflows/classroom.yml +++ b/.github/workflows/classroom.yml @@ -19,7 +19,7 @@ jobs: with: test-name: Lexer e parser setup-command: '' - command: java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy + command: mvn package ; java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy --pass=s --test --dir src/test/data/pa1/sample/ timeout: 10 max-score: 10 From 8e058658befbe0191fd2884150055edb33b0b960 Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Wed, 9 Apr 2025 13:38:38 +0000 Subject: [PATCH 09/21] GitHub Classroom Autograding Workflow --- .github/workflows/classroom.yml | 38 ++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/.github/workflows/classroom.yml b/.github/workflows/classroom.yml index b794a38..138cd2c 100644 --- a/.github/workflows/classroom.yml +++ b/.github/workflows/classroom.yml @@ -13,19 +13,41 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 - - name: Lexer e parser - id: lexer-e-parser + - name: class_attr + id: class_attr uses: classroom-resources/autograding-command-grader@v1 with: - test-name: Lexer e parser + test-name: class_attr + setup-command: mvn package + command: ' java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy + --pass=s --test --dir src/test/data/pa1/sample/class_attr.py' + timeout: 10 + max-score: 1 + - name: class_attr_get + id: class_attr_get + uses: classroom-resources/autograding-command-grader@v1 + with: + test-name: class_attr_get + setup-command: '' + command: ' java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy + --pass=s --test --dir src/test/data/pa1/sample/class_attr_get.py' + timeout: 10 + max-score: 1 + - name: expr_plus + id: expr_plus + uses: classroom-resources/autograding-command-grader@v1 + with: + test-name: expr_plus setup-command: '' - command: mvn package ; java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy - --pass=s --test --dir src/test/data/pa1/sample/ + command: ' java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy + --pass=s --test --dir src/test/data/pa1/sample/expr_plus.py' timeout: 10 - max-score: 10 + max-score: 1 - name: Autograding Reporter uses: classroom-resources/autograding-grading-reporter@v1 env: - LEXER-E-PARSER_RESULTS: "${{steps.lexer-e-parser.outputs.result}}" + CLASS_ATTR_RESULTS: "${{steps.class_attr.outputs.result}}" + CLASS_ATTR_GET_RESULTS: "${{steps.class_attr_get.outputs.result}}" + EXPR_PLUS_RESULTS: "${{steps.expr_plus.outputs.result}}" with: - runners: lexer-e-parser + runners: class_attr,class_attr_get,expr_plus From 94bb5195c368ff9bed84f01b426b28d5e032baed Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Wed, 9 Apr 2025 13:38:38 +0000 Subject: [PATCH 10/21] Create GitHub Classroom Autograding Workflow --- .github/workflows/classroom.yml | 53 +++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 .github/workflows/classroom.yml diff --git a/.github/workflows/classroom.yml b/.github/workflows/classroom.yml new file mode 100644 index 0000000..138cd2c --- /dev/null +++ b/.github/workflows/classroom.yml @@ -0,0 +1,53 @@ +name: Autograding Tests +'on': +- push +- repository_dispatch +permissions: + checks: write + actions: read + contents: read +jobs: + run-autograding-tests: + runs-on: ubuntu-latest + if: github.actor != 'github-classroom[bot]' + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: class_attr + id: class_attr + uses: classroom-resources/autograding-command-grader@v1 + with: + test-name: class_attr + setup-command: mvn package + command: ' java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy + --pass=s --test --dir src/test/data/pa1/sample/class_attr.py' + timeout: 10 + max-score: 1 + - name: class_attr_get + id: class_attr_get + uses: classroom-resources/autograding-command-grader@v1 + with: + test-name: class_attr_get + setup-command: '' + command: ' java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy + --pass=s --test --dir src/test/data/pa1/sample/class_attr_get.py' + timeout: 10 + max-score: 1 + - name: expr_plus + id: expr_plus + uses: classroom-resources/autograding-command-grader@v1 + with: + test-name: expr_plus + setup-command: '' + command: ' java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy + --pass=s --test --dir src/test/data/pa1/sample/expr_plus.py' + timeout: 10 + max-score: 1 + - name: Autograding Reporter + uses: classroom-resources/autograding-grading-reporter@v1 + env: + CLASS_ATTR_RESULTS: "${{steps.class_attr.outputs.result}}" + CLASS_ATTR_GET_RESULTS: "${{steps.class_attr_get.outputs.result}}" + EXPR_PLUS_RESULTS: "${{steps.expr_plus.outputs.result}}" + with: + runners: class_attr,class_attr_get,expr_plus From 55a45833f2cb810cc1ba40b6fc1a21bedbea6503 Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Wed, 9 Apr 2025 13:58:46 +0000 Subject: [PATCH 11/21] GitHub Classroom Autograding Workflow --- .github/workflows/classroom.yml | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/.github/workflows/classroom.yml b/.github/workflows/classroom.yml index 138cd2c..e8d7ad6 100644 --- a/.github/workflows/classroom.yml +++ b/.github/workflows/classroom.yml @@ -13,26 +13,6 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 - - name: class_attr - id: class_attr - uses: classroom-resources/autograding-command-grader@v1 - with: - test-name: class_attr - setup-command: mvn package - command: ' java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy - --pass=s --test --dir src/test/data/pa1/sample/class_attr.py' - timeout: 10 - max-score: 1 - - name: class_attr_get - id: class_attr_get - uses: classroom-resources/autograding-command-grader@v1 - with: - test-name: class_attr_get - setup-command: '' - command: ' java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy - --pass=s --test --dir src/test/data/pa1/sample/class_attr_get.py' - timeout: 10 - max-score: 1 - name: expr_plus id: expr_plus uses: classroom-resources/autograding-command-grader@v1 @@ -46,8 +26,6 @@ jobs: - name: Autograding Reporter uses: classroom-resources/autograding-grading-reporter@v1 env: - CLASS_ATTR_RESULTS: "${{steps.class_attr.outputs.result}}" - CLASS_ATTR_GET_RESULTS: "${{steps.class_attr_get.outputs.result}}" EXPR_PLUS_RESULTS: "${{steps.expr_plus.outputs.result}}" with: - runners: class_attr,class_attr_get,expr_plus + runners: expr_plus From 5201d3b93a2b2528b6fad05030c90206fd7f579c Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Sun, 13 Apr 2025 11:23:26 +0000 Subject: [PATCH 12/21] GitHub Classroom Autograding Workflow --- .github/workflows/classroom.yml | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/.github/workflows/classroom.yml b/.github/workflows/classroom.yml index e8d7ad6..75be0c3 100644 --- a/.github/workflows/classroom.yml +++ b/.github/workflows/classroom.yml @@ -13,19 +13,21 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 - - name: expr_plus - id: expr_plus - uses: classroom-resources/autograding-command-grader@v1 + - name: expr_test + id: expr_test + uses: classroom-resources/autograding-io-grader@v1 with: - test-name: expr_plus - setup-command: '' - command: ' java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy - --pass=s --test --dir src/test/data/pa1/sample/expr_plus.py' + test-name: expr_test + setup-command: mvn clean package + command: java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy + --pass=s --test --dir src/test/data/pa1/sample/expr_plus.py + input: '' + expected-output: 'Tests: 1 passed, 0 failed, and 0 ignored.' + comparison-method: contains timeout: 10 - max-score: 1 - name: Autograding Reporter uses: classroom-resources/autograding-grading-reporter@v1 env: - EXPR_PLUS_RESULTS: "${{steps.expr_plus.outputs.result}}" + EXPR_TEST_RESULTS: "${{steps.expr_test.outputs.result}}" with: - runners: expr_plus + runners: expr_test From cf5872ab58054f1e8b681dd7f73452318c5c286f Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Sun, 13 Apr 2025 11:26:29 +0000 Subject: [PATCH 13/21] GitHub Classroom Autograding Workflow From 6d127a0ff63b00222802e032316ffa3fe5e6f44d Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Sun, 13 Apr 2025 11:29:53 +0000 Subject: [PATCH 14/21] GitHub Classroom Autograding Workflow --- .github/workflows/classroom.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/classroom.yml b/.github/workflows/classroom.yml index 75be0c3..295fe5c 100644 --- a/.github/workflows/classroom.yml +++ b/.github/workflows/classroom.yml @@ -18,9 +18,9 @@ jobs: uses: classroom-resources/autograding-io-grader@v1 with: test-name: expr_test - setup-command: mvn clean package - command: java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy - --pass=s --test --dir src/test/data/pa1/sample/expr_plus.py + setup-command: '' + command: mvn clean package;java -cp "chocopy-ref.jar:target/assignment.jar" + chocopy.ChocoPy --pass=s --test --dir src/test/data/pa1/sample/expr_plus.py input: '' expected-output: 'Tests: 1 passed, 0 failed, and 0 ignored.' comparison-method: contains From 6133caa9a54a32cd4bc90a59f0d4c90b3f8f1650 Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Sun, 13 Apr 2025 11:38:38 +0000 Subject: [PATCH 15/21] GitHub Classroom Autograding Workflow --- .github/workflows/classroom.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/classroom.yml b/.github/workflows/classroom.yml index 295fe5c..f973c02 100644 --- a/.github/workflows/classroom.yml +++ b/.github/workflows/classroom.yml @@ -18,9 +18,9 @@ jobs: uses: classroom-resources/autograding-io-grader@v1 with: test-name: expr_test - setup-command: '' - command: mvn clean package;java -cp "chocopy-ref.jar:target/assignment.jar" - chocopy.ChocoPy --pass=s --test --dir src/test/data/pa1/sample/expr_plus.py + setup-command: mvn package + command: java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy + --pass=s --test --dir src/test/data/pa1/sample/expr_plus.py input: '' expected-output: 'Tests: 1 passed, 0 failed, and 0 ignored.' comparison-method: contains From 1d75300cdd48017acb25dcd1f72963b6d2ac8359 Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Sun, 13 Apr 2025 11:41:06 +0000 Subject: [PATCH 16/21] GitHub Classroom Autograding Workflow --- .github/workflows/classroom.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/classroom.yml b/.github/workflows/classroom.yml index f973c02..e7d767a 100644 --- a/.github/workflows/classroom.yml +++ b/.github/workflows/classroom.yml @@ -18,8 +18,8 @@ jobs: uses: classroom-resources/autograding-io-grader@v1 with: test-name: expr_test - setup-command: mvn package - command: java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy + setup-command: '' + command: mvn package ; java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy --pass=s --test --dir src/test/data/pa1/sample/expr_plus.py input: '' expected-output: 'Tests: 1 passed, 0 failed, and 0 ignored.' From b2216717cc0fff7afcc1b0e4257ff2591f0fd715 Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Sun, 13 Apr 2025 11:53:22 +0000 Subject: [PATCH 17/21] GitHub Classroom Autograding Workflow --- .github/workflows/classroom.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/classroom.yml b/.github/workflows/classroom.yml index e7d767a..9c0dbb1 100644 --- a/.github/workflows/classroom.yml +++ b/.github/workflows/classroom.yml @@ -13,13 +13,13 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 - - name: expr_test - id: expr_test + - name: expr_plus + id: expr_plus uses: classroom-resources/autograding-io-grader@v1 with: - test-name: expr_test + test-name: expr_plus setup-command: '' - command: mvn package ; java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy + command: java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy --pass=s --test --dir src/test/data/pa1/sample/expr_plus.py input: '' expected-output: 'Tests: 1 passed, 0 failed, and 0 ignored.' @@ -28,6 +28,6 @@ jobs: - name: Autograding Reporter uses: classroom-resources/autograding-grading-reporter@v1 env: - EXPR_TEST_RESULTS: "${{steps.expr_test.outputs.result}}" + EXPR_PLUS_RESULTS: "${{steps.expr_plus.outputs.result}}" with: - runners: expr_test + runners: expr_plus From a2d6586c6d3b4dfd3ae7a53038499ae0c3ecf083 Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Sun, 13 Apr 2025 12:22:39 +0000 Subject: [PATCH 18/21] GitHub Classroom Autograding Workflow --- .github/workflows/classroom.yml | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/.github/workflows/classroom.yml b/.github/workflows/classroom.yml index 9c0dbb1..5575784 100644 --- a/.github/workflows/classroom.yml +++ b/.github/workflows/classroom.yml @@ -13,21 +13,19 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 - - name: expr_plus - id: expr_plus - uses: classroom-resources/autograding-io-grader@v1 + - name: expr + id: expr + uses: classroom-resources/autograding-command-grader@v1 with: - test-name: expr_plus - setup-command: '' + test-name: expr + setup-command: mvn package command: java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy --pass=s --test --dir src/test/data/pa1/sample/expr_plus.py - input: '' - expected-output: 'Tests: 1 passed, 0 failed, and 0 ignored.' - comparison-method: contains timeout: 10 + max-score: 1 - name: Autograding Reporter uses: classroom-resources/autograding-grading-reporter@v1 env: - EXPR_PLUS_RESULTS: "${{steps.expr_plus.outputs.result}}" + EXPR_RESULTS: "${{steps.expr.outputs.result}}" with: - runners: expr_plus + runners: expr From a0ed59063b84f6c4ae3f48df2e984e35f0774243 Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Sun, 13 Apr 2025 12:22:39 +0000 Subject: [PATCH 19/21] Create GitHub Classroom Autograding Workflow --- .github/workflows/classroom.yml | 36 +++++++-------------------------- 1 file changed, 7 insertions(+), 29 deletions(-) diff --git a/.github/workflows/classroom.yml b/.github/workflows/classroom.yml index 138cd2c..5575784 100644 --- a/.github/workflows/classroom.yml +++ b/.github/workflows/classroom.yml @@ -13,41 +13,19 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 - - name: class_attr - id: class_attr + - name: expr + id: expr uses: classroom-resources/autograding-command-grader@v1 with: - test-name: class_attr + test-name: expr setup-command: mvn package - command: ' java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy - --pass=s --test --dir src/test/data/pa1/sample/class_attr.py' - timeout: 10 - max-score: 1 - - name: class_attr_get - id: class_attr_get - uses: classroom-resources/autograding-command-grader@v1 - with: - test-name: class_attr_get - setup-command: '' - command: ' java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy - --pass=s --test --dir src/test/data/pa1/sample/class_attr_get.py' - timeout: 10 - max-score: 1 - - name: expr_plus - id: expr_plus - uses: classroom-resources/autograding-command-grader@v1 - with: - test-name: expr_plus - setup-command: '' - command: ' java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy - --pass=s --test --dir src/test/data/pa1/sample/expr_plus.py' + command: java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy + --pass=s --test --dir src/test/data/pa1/sample/expr_plus.py timeout: 10 max-score: 1 - name: Autograding Reporter uses: classroom-resources/autograding-grading-reporter@v1 env: - CLASS_ATTR_RESULTS: "${{steps.class_attr.outputs.result}}" - CLASS_ATTR_GET_RESULTS: "${{steps.class_attr_get.outputs.result}}" - EXPR_PLUS_RESULTS: "${{steps.expr_plus.outputs.result}}" + EXPR_RESULTS: "${{steps.expr.outputs.result}}" with: - runners: class_attr,class_attr_get,expr_plus + runners: expr From b0d13bd4da951f576d24fc2964794d07b9c95f12 Mon Sep 17 00:00:00 2001 From: Marco de Sousa Date: Wed, 16 Apr 2025 00:14:51 -0300 Subject: [PATCH 20/21] fix LINE_START --- src/main/cup/chocopy/pa1/ChocoPy.cup | 23 +++++++++++++++++++++-- src/main/jflex/chocopy/pa1/ChocoPy.jflex | 12 +++++++++--- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/main/cup/chocopy/pa1/ChocoPy.cup b/src/main/cup/chocopy/pa1/ChocoPy.cup index 380d9b7..1c6c5a3 100644 --- a/src/main/cup/chocopy/pa1/ChocoPy.cup +++ b/src/main/cup/chocopy/pa1/ChocoPy.cup @@ -130,6 +130,16 @@ action code {: return new ComplexSymbolFactory.Location(first.getLocation()[0], first.getLocation()[1]); } + /** Return the rightmost non-whitespace location in NODES, or null if NODES + * is empty. Assumes that the nodes of NODES are ordered left to right. */ + ComplexSymbolFactory.Location getRight(List nodes) { + if (nodes.isEmpty()) { + return null; + } + Node last = nodes.get(nodes.size() - 1); + return new ComplexSymbolFactory.Location(last.getLocation()[0], + last.getLocation()[1]); + } :} @@ -197,6 +207,7 @@ terminal String STRING; /* Operators. */ terminal String PLUS; terminal String MINUS; +terminal String UMINUS; terminal String STAR; terminal String DOUBLE_SLASH; terminal String PERCENT; @@ -233,7 +244,9 @@ non terminal Expr expr, binary_expr; /* Precedences (lowest to highest) for resolving what would otherwise be * ambiguities in the form of shift/reduce conflicts.. */ -precedence left PLUS; +precedence left PLUS, MINUS; +precedence left STAR; +precedence right UMINUS; /* The start symbol. */ start with program; @@ -276,10 +289,16 @@ expr ::= binary_expr:e {: RESULT = e; :} | NUMBER:n {: RESULT = new IntegerLiteral(nxleft, nxright, n); :} ; +expr ::= MINUS:op expr:e + {: RESULT = new UnaryExpr(opxleft, exright, op, e); :} + ; /* A binary expression, illustrating how to find the left and right * source position of a phrase. */ binary_expr ::= expr:e1 PLUS:op expr:e2 {: RESULT = new BinaryExpr(e1xleft, e2xright, e1, op, e2); :} - ; + | expr:e1 MINUS:op expr:e2 + {: RESULT = new BinaryExpr(e1xleft, e2xright, e1, op, e2); :} + | expr:e1 STAR:op expr:e2 + {: RESULT = new BinaryExpr(e1xleft, e2xright, e1, op, e2); :}; \ No newline at end of file diff --git a/src/main/jflex/chocopy/pa1/ChocoPy.jflex b/src/main/jflex/chocopy/pa1/ChocoPy.jflex index 86870b3..fd8a01a 100644 --- a/src/main/jflex/chocopy/pa1/ChocoPy.jflex +++ b/src/main/jflex/chocopy/pa1/ChocoPy.jflex @@ -135,6 +135,7 @@ Comment = #.*# emitNewline = true; startOfLine = true; yybegin(LINE_START); + } /* Operators (item 3.5 da documentação) */ @@ -223,6 +224,7 @@ Comment = #.*# if (lookahead == '#' || lookahead == '\n' || lookahead == '\r' || lookahead == -1) { startOfLine = false; yybegin(YYINITIAL); + return symbol(ChocoPyTokens.NEWLINE); } else { int prevIndent = indentStack.peek(); if (currentIndent == prevIndent) { @@ -232,6 +234,7 @@ Comment = #.*# return symbol(ChocoPyTokens.NEWLINE); } yybegin(YYINITIAL); + return symbol(ChocoPyTokens.NEWLINE); } else if (currentIndent > prevIndent) { indentStack.push(currentIndent); yybegin(YYINITIAL); @@ -259,14 +262,17 @@ Comment = #.*# } } -<> { - while (indentStack.size() > 1) { +<> { + if (emitNewline) { + emitNewline = false; + return symbol(ChocoPyTokens.NEWLINE); + } + while (indentStack.size() > 1) { indentStack.pop(); return symbol(ChocoPyTokens.DEDENT); } return symbol(ChocoPyTokens.EOF); } - /* Error fallback. */ [^] { return symbol(ChocoPyTokens.UNRECOGNIZED); } From 3f5725b6fbd94df07f65d9e54bf56d1f8ba1fdbc Mon Sep 17 00:00:00 2001 From: Henrique Porto Date: Wed, 16 Apr 2025 07:52:59 -0300 Subject: [PATCH 21/21] =?UTF-8?q?corre=C3=A7=C3=A3o=20coment=C3=A1rios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/jflex/chocopy/pa1/ChocoPy.jflex | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/jflex/chocopy/pa1/ChocoPy.jflex b/src/main/jflex/chocopy/pa1/ChocoPy.jflex index 86870b3..464856e 100644 --- a/src/main/jflex/chocopy/pa1/ChocoPy.jflex +++ b/src/main/jflex/chocopy/pa1/ChocoPy.jflex @@ -110,9 +110,12 @@ Identifier: o nome de variavel ou função IdString = [_a-zA-Z][_a-z0-9A-Z]* /* -Comment: Comentário de linha única (sem multiline) -> python regex equivalent -> (?P#.*#) +Comment: +No item 3.1.3 diz: A comment starts with a hash character (#) that is not part of a string literal, and ends at the end of the +physical line. Comments are ignored by the lexical analyzer; they are not emitted as tokens. +E seguindo o 3.1.1 que diz que uma linha pode ser \n, \r ou \r\n */ -Comment = #.*# +Comment = #[^\n\r]* /* TODO - NEWLINE, INDENT, DEDENT (usar variavel global, entender melhor no item 3.1.5). @@ -130,6 +133,9 @@ Comment = #.*# /* Whitespace. */ {WhiteSpace} { /* ignore */ } + /* Comment. */ + {Comment} { /* ignore */ } + /* Delimiters */ {LineBreak} { emitNewline = true;