handle inline c-like comments in lexer
This commit is contained in:
Eldred Habert
2020-10-19 19:36:49 +02:00
committed by GitHub
16 changed files with 77 additions and 6 deletions

View File

@@ -22,6 +22,7 @@ enum WarningID {
WARNING_EMPTY_ENTRY, /* Empty entry in `db`, `dw` or `dl` */ WARNING_EMPTY_ENTRY, /* Empty entry in `db`, `dw` or `dl` */
WARNING_LARGE_CONSTANT, /* Constants too large */ WARNING_LARGE_CONSTANT, /* Constants too large */
WARNING_LONG_STR, /* String too long for internal buffers */ WARNING_LONG_STR, /* String too long for internal buffers */
WARNING_NESTED_COMMENT, /* Comment-start delimeter in a block comment */
WARNING_OBSOLETE, /* Obsolete things */ WARNING_OBSOLETE, /* Obsolete things */
WARNING_SHIFT, /* Shifting undefined behavior */ WARNING_SHIFT, /* Shifting undefined behavior */
WARNING_SHIFT_AMOUNT, /* Strange shift amount */ WARNING_SHIFT_AMOUNT, /* Strange shift amount */

View File

@@ -921,6 +921,33 @@ void lexer_DumpStringExpansions(void)
free(stack); 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 */ /* Function to discard all of a line's comments */
static void discardComment(void) static void discardComment(void)
@@ -1476,8 +1503,6 @@ static int yylex_NORMAL(void)
return T_OP_ADD; return T_OP_ADD;
case '-': case '-':
return T_OP_SUB; return T_OP_SUB;
case '/':
return T_OP_DIV;
case '~': case '~':
return T_OP_NOT; return T_OP_NOT;
@@ -1498,7 +1523,14 @@ static int yylex_NORMAL(void)
/* Handle ambiguous 1- or 2-char tokens */ /* Handle ambiguous 1- or 2-char tokens */
char secondChar; 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 */ case '|': /* Either binary or logical OR */
secondChar = peek(0); secondChar = peek(0);
if (secondChar == '|') { if (secondChar == '|') {

View File

@@ -47,13 +47,22 @@ The assembler
.Em always .Em always
ignores comments and their contents. ignores comments and their contents.
.Pp .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 \&; .Ql \&;
not inside a string, is a comment until the end of the line. 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 * .Ql *
(not even spaces before it) are ignored. (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 .Pp
Sometimes lines can be too long and it may be necessary to split them. 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: To do so, put a backslash at the end of the line:

View File

@@ -36,6 +36,7 @@ static enum WarningState const defaultWarnings[NB_WARNINGS] = {
[WARNING_EMPTY_ENTRY] = WARNING_DISABLED, [WARNING_EMPTY_ENTRY] = WARNING_DISABLED,
[WARNING_LARGE_CONSTANT] = WARNING_DISABLED, [WARNING_LARGE_CONSTANT] = WARNING_DISABLED,
[WARNING_LONG_STR] = WARNING_DISABLED, [WARNING_LONG_STR] = WARNING_DISABLED,
[WARNING_NESTED_COMMENT] = WARNING_ENABLED,
[WARNING_OBSOLETE] = WARNING_ENABLED, [WARNING_OBSOLETE] = WARNING_ENABLED,
[WARNING_SHIFT] = WARNING_DISABLED, [WARNING_SHIFT] = WARNING_DISABLED,
[WARNING_SHIFT_AMOUNT] = WARNING_DISABLED, [WARNING_SHIFT_AMOUNT] = WARNING_DISABLED,
@@ -75,6 +76,7 @@ static char const *warningFlags[NB_WARNINGS_ALL] = {
"empty-entry", "empty-entry",
"large-constant", "large-constant",
"long-string", "long-string",
"nested-comment",
"obsolete", "obsolete",
"shift", "shift",
"shift-amount", "shift-amount",
@@ -104,6 +106,7 @@ static uint8_t const _wallCommands[] = {
/* Warnings that are less likely to indicate an error */ /* Warnings that are less likely to indicate an error */
static uint8_t const _wextraCommands[] = { static uint8_t const _wextraCommands[] = {
WARNING_EMPTY_ENTRY, WARNING_EMPTY_ENTRY,
WARNING_NESTED_COMMENT,
META_WARNING_DONE META_WARNING_DONE
}; };
@@ -115,6 +118,7 @@ static uint8_t const _weverythingCommands[] = {
WARNING_EMPTY_ENTRY, WARNING_EMPTY_ENTRY,
WARNING_LARGE_CONSTANT, WARNING_LARGE_CONSTANT,
WARNING_LONG_STR, WARNING_LONG_STR,
WARNING_NESTED_COMMENT,
WARNING_OBSOLETE, WARNING_OBSOLETE,
WARNING_SHIFT, WARNING_SHIFT,
WARNING_SHIFT_AMOUNT, WARNING_SHIFT_AMOUNT,

View File

@@ -0,0 +1,2 @@
/* block comments containing /* throw warnings */
PRINTT "reachable\n"

View File

@@ -0,0 +1,2 @@
warning: block-comment-contents-error.asm(1): [-Wnested-comment]
/* in block comment

View File

@@ -0,0 +1 @@
reachable

View File

@@ -0,0 +1 @@
PRINTT /* block comments must terminate before EOF

View File

@@ -0,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)!

View File

@@ -0,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"

View File

View File

@@ -0,0 +1,3 @@
hi
block (/* ... */) comments at ends of line are fine
mutliline

View File

@@ -0,0 +1,2 @@
PRINTT /* // PRINTT "this is **comm //ented out\n" */ "this is not commented out\n"
PRINTT /*//*/ "this is not commented out\n"

View File

@@ -0,0 +1,2 @@
warning: weird-comments.asm(2): [-Wnested-comment]
/* in block comment

View File

@@ -0,0 +1,2 @@
this is not commented out
this is not commented out