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