Detecting and skipping line comments with Flex

前端 未结 3 1806
自闭症患者
自闭症患者 2020-12-10 19:51

How can I detect one line comments like // in Flex and skip those lines?

Also, for /* comments, will the following snippet be enough?

3条回答
  •  难免孤独
    2020-12-10 20:23

    For // you can read until you find the end of line \n or EOF, in case if the comment was at the end of file, for example:

    static void
    skip_single_line_comment(void)
    {
      int c;
    
      /* Read until we find \n or EOF */
      while((c = input()) != '\n' && c != EOF)
        ;
    
      /* Maybe you want to place back EOF? */
      if(c == EOF)
        unput(c);
    }
    

    as for multiple lines comments /* */, you can read until you see * and peek the next character, if it's / this means this is the end of comment, if not just skip it with any other character. You shouldn't expect EOF, means unclosed comment:

    static void
    skip_multiple_line_comment(void)
    {
      int c;
    
      for(;;)
      {
        switch(input())
        {
          /* We expect ending the comment first before EOF */
          case EOF:
            fprintf(stderr, "Error unclosed comment, expect */\n");
            exit(-1);
            goto done;
          break;
          /* Is it the end of comment? */
          case '*':
            if((c = input()) == '/')
              goto done;
            unput(c);
            break;
          default:
            /* skip this character */
            break;
        }
      }
    
    done:
      /* exit entry */ ;
    }
    

    Complete file:

    %{
    #include 
    
    static void skip_single_line_comment(void);
    static void skip_multiple_line_comment(void);
    
    %}
    
    %option noyywrap
    
    %%
    "//"              { puts("short comment was skipped ");
                        skip_single_line_comment();}
    
    "/*"              { puts("long comment begins ");
                        skip_multiple_line_comment();
                        puts("long comment ends");}
    
    " "               { /* empty */ }
    [\n|\r\n\t]       { /* empty */ }
    .                 { fprintf(stderr, "Tokenizing error: '%c'\n", *yytext);
                        yyterminate(); }
    %%
    
    static void
    skip_single_line_comment(void)
    {
      int c;
    
      /* Read until we find \n or EOF */
      while((c = input()) != '\n' && c != EOF)
        ;
    
      /* Maybe you want to place back EOF? */
      if(c == EOF)
        unput(c);
    }
    
    static void
    skip_multiple_line_comment(void)
    {
      int c;
    
      for(;;)
      {
        switch(input())
        {
          /* We expect ending the comment first before EOF */
          case EOF:
            fprintf(stderr, "Error unclosed comment, expect */\n");
            exit(-1);
            goto done;
          break;
          /* Is it the end of comment? */
          case '*':
            if((c = input()) == '/')
              goto done;
            unput(c);
            break;
          default:
            /* skip this character */
            break;
        }
      }
    
    done:
      /* exit entry */ ;
    }
    
    int main(int argc, char **argv)
    {
      yylex();
      return 0;
    }
    

提交回复
热议问题