@@ -511,33 +511,35 @@ int xx_get_token(xx_scanner_state *s, xx_scanner_token *token) {
511
511
return 0 ;
512
512
}
513
513
514
- DCOMMENT = (" /**" ([^*]+|[*]+[^/* ])*[*]*"*/ " );
515
- DCOMMENT {
516
- start++;
517
- token->opcode = XX_T_COMMENT;
518
- token->value = estrndup(start, YYCURSOR - start - 1);
519
- token->len = YYCURSOR - start - 1;
520
- {
521
- int k, ch = s->active_char;
522
- for (k = 0; k < (token->len - 1); k++) {
523
- if (token->value[k] == '\n ') {
524
- ch = 1;
525
- s->active_line++;
526
- } else {
527
- ch++;
528
- }
529
- }
530
- s->active_char = ch;
514
+ COMMENT = (" /*" ([^*]+|[*]+[^/* ])* [*]* "*/ " );
515
+ COMMENT {
516
+ int has_data = 0;
517
+ if (YYCURSOR - start == 5) {
518
+ // Empty dockblocks like /***/
519
+ token->opcode = XX_T_COMMENT;
520
+ } else if (YYCURSOR - start == 4) {
521
+ // Empty comment like /**/
522
+ token->opcode = XX_T_IGNORE;
523
+ } else if (start[2] == '*' && start[YYCURSOR - start - 2] == '*') {
524
+ token->opcode = XX_T_COMMENT;
525
+ } else {
526
+ // C comments like /* ... */
527
+ token->opcode = XX_T_IGNORE;
531
528
}
532
- return 0;
533
- }
534
529
535
- COMMENT = (" /* "([^*]+|[*]+[^/*])*[*]*"*/ " );
536
- COMMENT {
537
- token->opcode = XX_T_IGNORE;
538
- token->value = estrndup(start, YYCURSOR - start - 1);
539
- token->len = YYCURSOR - start - 1;
540
- {
530
+ if (token->opcode == XX_T_COMMENT && YYCURSOR - start > 5) {
531
+ has_data = 1;
532
+ start++;
533
+ }
534
+
535
+ if (token->opcode == XX_T_IGNORE && YYCURSOR - start > 4) {
536
+ has_data = 1;
537
+ }
538
+
539
+ if (has_data == 1) {
540
+ token->value = estrndup(start, YYCURSOR - start - 1);
541
+ token->len = YYCURSOR - start - 1;
542
+
541
543
int k, ch = s->active_char;
542
544
for (k = 0; k < (token->len - 1); k++) {
543
545
if (token->value[k] == '\n ') {
@@ -547,10 +549,20 @@ int xx_get_token(xx_scanner_state *s, xx_scanner_token *token) {
547
549
ch++;
548
550
}
549
551
}
552
+
550
553
s->active_char = ch;
554
+ } else if (token->opcode == XX_T_COMMENT) {
555
+ start++;
556
+ token->value = estrndup(start, YYCURSOR - start - 1);
557
+ token->len = YYCURSOR - start - 1;
558
+ }
559
+
560
+ if (token->opcode == XX_T_IGNORE) {
561
+ // Ignore data for C comments
562
+ efree(token->value);
563
+ token->len = 0;
551
564
}
552
- efree(token->value);
553
- token->len = 0;
565
+
554
566
return 0;
555
567
}
556
568
0 commit comments