shithub: rgbds

Download patch

ref: 55be77be69fb2392404203ab6735e05a9fcea067
parent: 42b3a173566a70c665066bf9e1f8d2568b9b176c
author: anderoonies <andrewbayer2016@u.northwestern.edu>
date: Wed Oct 14 07:59:14 EDT 2020

discard block comments delimited with /* */

--- a/include/asm/warning.h
+++ b/include/asm/warning.h
@@ -22,6 +22,7 @@
 	WARNING_EMPTY_ENTRY,	      /* Empty entry in `db`, `dw` or `dl` */
 	WARNING_LARGE_CONSTANT,	      /* Constants too large */
 	WARNING_LONG_STR,	      /* String too long for internal buffers */
+	WARNING_NESTED_COMMENT,	      /* Comment-start delimeter in a block comment */
 	WARNING_OBSOLETE,	      /* Obsolete things */
 	WARNING_SHIFT,		      /* Shifting undefined behavior */
 	WARNING_SHIFT_AMOUNT,	      /* Strange shift amount */
--- a/src/asm/lexer.c
+++ b/src/asm/lexer.c
@@ -921,6 +921,33 @@
 	free(stack);
 }
 
+/* Discards an block comment */
+static void discardBlockComment(void)
+{
+	dbgPrint("Discarding block comment\n");
+	for (;;) {
+		switch (nextChar()) {
+		case EOF:
+			error("Unterminated block comment\n");
+			return;
+		case '/':
+			if (peek(0) == '*') {
+				warning(WARNING_NESTED_COMMENT,
+					"/* in block comment\n");
+			}
+			continue;
+		case '*':
+			if (peek(0) == '/') {
+				shiftChars(1);
+				return;
+			}
+			/* fallthrough */
+		default:
+			continue;
+		}
+	}
+}
+
 /* Function to discard all of a line's comments */
 
 static void discardComment(void)
@@ -1476,8 +1503,6 @@
 			return T_OP_ADD;
 		case '-':
 			return T_OP_SUB;
-		case '/':
-			return T_OP_DIV;
 		case '~':
 			return T_OP_NOT;
 
@@ -1498,7 +1523,14 @@
 
 		/* Handle ambiguous 1- or 2-char tokens */
 		char secondChar;
-
+		case '/': /* Either division or a block comment */
+			secondChar = peek(0);
+			if (secondChar == '*') {
+				shiftChars(1);
+				discardBlockComment();
+				break;
+			}
+			return T_OP_DIV;
 		case '|': /* Either binary or logical OR */
 			secondChar = peek(0);
 			if (secondChar == '|') {
--- a/src/asm/warning.c
+++ b/src/asm/warning.c
@@ -36,6 +36,7 @@
 	[WARNING_EMPTY_ENTRY]		= WARNING_DISABLED,
 	[WARNING_LARGE_CONSTANT]	= WARNING_DISABLED,
 	[WARNING_LONG_STR]		= WARNING_DISABLED,
+	[WARNING_NESTED_COMMENT]	= WARNING_ENABLED,
 	[WARNING_OBSOLETE]		= WARNING_ENABLED,
 	[WARNING_SHIFT]			= WARNING_DISABLED,
 	[WARNING_SHIFT_AMOUNT]		= WARNING_DISABLED,
@@ -75,6 +76,7 @@
 	"empty-entry",
 	"large-constant",
 	"long-string",
+	"nested-comment",
 	"obsolete",
 	"shift",
 	"shift-amount",
@@ -104,6 +106,7 @@
 /* Warnings that are less likely to indicate an error */
 static uint8_t const _wextraCommands[] = {
 	WARNING_EMPTY_ENTRY,
+	WARNING_NESTED_COMMENT,
 	META_WARNING_DONE
 };
 
@@ -115,6 +118,7 @@
 	WARNING_EMPTY_ENTRY,
 	WARNING_LARGE_CONSTANT,
 	WARNING_LONG_STR,
+	WARNING_NESTED_COMMENT,
 	WARNING_OBSOLETE,
 	WARNING_SHIFT,
 	WARNING_SHIFT_AMOUNT,
--- /dev/null
+++ b/test/asm/block-comment-contents-error.asm
@@ -1,0 +1,2 @@
+/* block comments containing /* throw warnings */
+PRINTT "reachable\n"
--- /dev/null
+++ b/test/asm/block-comment-contents-error.err
@@ -1,0 +1,2 @@
+warning: block-comment-contents-error.asm(1): [-Wnested-comment]
+    /* in block comment
--- /dev/null
+++ b/test/asm/block-comment-contents-error.out
@@ -1,0 +1,1 @@
+reachable
--- /dev/null
+++ b/test/asm/block-comment-termination-error.asm
@@ -1,0 +1,1 @@
+PRINTT /* block comments must terminate before EOF
\ No newline at end of file
--- /dev/null
+++ b/test/asm/block-comment-termination-error.err
@@ -1,0 +1,5 @@
+ERROR: block-comment-termination-error.asm(1):
+    Unterminated block comment
+ERROR: block-comment-termination-error.asm(1):
+    syntax error
+error: Assembly aborted (2 errors)!
--- /dev/null
+++ b/test/asm/block-comment.asm
@@ -1,0 +1,5 @@
+PRINTT /* block comments are ignored // ** */ "hi\n"
+PRINTT "block (/* ... */) comments at ends of line are fine\n" /* hi */
+PRINTT /* block comments
+can span multiple lines
+*/ "mutliline\n"
--- /dev/null
+++ b/test/asm/block-comment.out
@@ -1,0 +1,3 @@
+hi
+block (/* ... */) comments at ends of line are fine
+mutliline
--- /dev/null
+++ b/test/asm/weird-comments.asm
@@ -1,0 +1,2 @@
+PRINTT /* // PRINTT "this is **comm //ented out\n" */ "this is not commented out\n"
+PRINTT /*//*/ "this is not commented out\n"
\ No newline at end of file
--- /dev/null
+++ b/test/asm/weird-comments.err
@@ -1,0 +1,2 @@
+warning: weird-comments.asm(2): [-Wnested-comment]
+    /* in block comment
--- /dev/null
+++ b/test/asm/weird-comments.out
@@ -1,0 +1,2 @@
+this is not commented out
+this is not commented out