shithub: rgbds

Download patch

ref: 7e1d20acdfd03bed76c66e213d2fd93cc703ac87
parent: 42b3a173566a70c665066bf9e1f8d2568b9b176c
parent: 5230104852a7af729105f2b13f1de78d95c3f9c8
author: Eldred Habert <eldredhabert0@gmail.com>
date: Mon Oct 19 15:36:49 EDT 2020

Merge pull request #607 from anderoonies/inline-comment-#537

handle inline c-like comments in lexer

--- 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/rgbasm.5
+++ b/src/asm/rgbasm.5
@@ -47,13 +47,22 @@
 .Em always
 ignores comments and their contents.
 .Pp
-There are two syntaxes for comments. The most common is that anything that follows a semicolon
+There are three syntaxes for comments. The most common is that anything that follows a semicolon
 .Ql \&;
 not inside a string, is a comment until the end of the line.
-The other is that lines beginning with a
+The second is a block comment, beginning with
+.Ql /*
+and ending with
+.Ql */ .
+It can be split across multiple lines, or occur in the middle of an expression:
+.Bd -literal -offset indent
+X = /* the value of x
+       should be 3 */ 3
+.Ed
+The third is that lines beginning with a
 .Ql *
 (not even spaces before it) are ignored.
-This second syntax is deprecated (will be removed in a future version) and should be replaced with the first one.
+This third syntax is deprecated (will be removed in a future version) and should be replaced with either of the first two.
 .Pp
 Sometimes lines can be too long and it may be necessary to split them.
 To do so, put a backslash at the end of the line:
--- 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