@@ -511,33 +511,35 @@ int xx_get_token(xx_scanner_state *s, xx_scanner_token *token) {
511511 return 0 ;
512512 }
513513
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;
531528 }
532- return 0;
533- }
534529
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+
541543 int k, ch = s->active_char;
542544 for (k = 0; k < (token->len - 1); k++) {
543545 if (token->value[k] == '\n ') {
@@ -547,10 +549,20 @@ int xx_get_token(xx_scanner_state *s, xx_scanner_token *token) {
547549 ch++;
548550 }
549551 }
552+
550553 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;
551564 }
552- efree(token->value);
553- token->len = 0;
565+
554566 return 0;
555567 }
556568
0 commit comments