Skynet094
Skynet094

Reputation: 463

Understanding lex code syntax

In the following lex code, I don't understand the use of the angle brackets, . How does the <newstate>{DEFINITION} syntax work?

     %{
    #include<stdio.h>
    int c=0;
    %}
    START "/*"
    END "*/"
    SIMPLE [^*]
    SPACE [ \t\n]
    COMPLEX "*"[^/]
    %s newstate
    %%
    "//"(.*[ \t]*.*)*[\n]+    {c++; fprintf(yyout," ");}
    {START}                    {yymore();BEGIN newstate;}
     <newstate>{SIMPLE}        {yymore();BEGIN newstate;}
     <newstate>{COMPLEX}      {yymore();BEGIN newstate;}
     <newstate>{SPACE}        {yymore();BEGIN newstate;}
     <newstate>{END}  {c++;fprintf(yyout," ");BEGIN 0;}
    %%
    main()
    {//program to remove comment lines
    yyin=fopen("file4","r");
    yyout=fopen("fileout4","w");system("cat file4");
    yylex();system("cat fileout4");
    printf("no.of comments=%d",c);
    fclose(yyin);
    fclose(yyout);
    }
    `

Upvotes: 2

Views: 397

Answers (1)

Tahar HARAZ
Tahar HARAZ

Reputation: 124

With this "%s newstate" you are declaring a start condition name, in your case the name is "newstate"; You can use %s ,%S or %Start to declare a start condition.

The conditions may be referenced at the head of a rule with the <> brackets.

e.g: referencing newstate as your start condition for first rule :

                <newstate> {SIMPLE}       { yymore(); BEGIN newstate; }

Your above rule will be only recognized when Lex is in the start condition named "newstate". You are entering this start condition by executing the action statement

                          BEGIN newstate;

Let me give you a sample example to understand its use : in this example, I will use three start conditions each one represents something, AN= animals, PT=Planets and BR= Birds.

This flex example will help you tell to which category the name you typed followed by "is?" belongs to. We have three categories: Animals , Planets and birds. (to make it simple I only handle monkey, horse, Jupiter and swan).

                     %{
                     #include<stdio.h>
                     %}

                     %START AN PT BR

                     %%
                     ^monkey             {ECHO; BEGIN AN;}
                     ^horse              {ECHO; BEGIN AN;}
                     ^Jupiter            {ECHO; BEGIN PT ;}
                     ^swan               {ECHO; BEGIN BR;}
                     \n                  {ECHO; BEGIN 0;}
                     <AN>is?             printf(" is an Animal.!");
                     <PT>is?            printf(" is a Planet in our solar system.!");
                     <BR>is?            printf(" is a Bird.!");
                     . ;
                     %%

                     main()
                     {
                     yylex();
                     }

For the following inputs we will be replacing "is ?" based on the prefix :

                 input  ->          monkey is ?
                 output ->          monkey is an Animal.!

Here we are replacing " is ?" with " is an Animal.!" by redirecting the Lexical Analyzer to the "AN" start condition hence the associated rule " is? printf(" is an Animal.!"); " will be executed.

                 input  ->          swan is ?
                 output ->          swan is Bird.!

Here we are replacing " is ?" with " is a Bird.!" by redirecting the Lexical Analyzer to the "BR" start condition hence the associated rule " is? printf(" is a Bird.!"); " will be executed.

                 input  ->          horse is ?
                 output ->          horse is an Animal.!

Here we are replacing " is ?" with " is an Animal.!" by redirecting the Lexical Analyzer to the "AN" start condition hence the associated rule " is? printf(" is an Animal.!"); " will be executed.

                 input  ->          Jupiter is ?
                 output ->          Jupiter is a Planet in our solar system.!

Here we are replacing " is ?" with " is a Planet in our solar system.!" by redirecting the Lexical Analyzer to the "PT" start condition hence associated rule " is? printf(" is a Planet in our solar system.!"); " will be executed.

So in this example you see that we are replacing " is ?" based on the prefix. If the prefix is Jupiter we echo "Jupiter" and redirect the Lexical Analyzer to the "PT" start condition hence the associated rule will be executed.

I hope this helped you to understand, let me know if you have any issues with the explanation!

Upvotes: 5

Related Questions