next up previous
Next: The role of the lexical Up: LEX Previous: How the input is matched

More examples

A FRENCH-TO-JAVANESE TRANSLATER.

[moreno@iguanodon lex]$ more src/french2javanese.l 
%s CR
VOWEL       [Aa]|[Ee]|[Ii]|[Oo]|[Uu]|[Yy]
CONSONANT   [B-Db-dF-Hf-hJ-Nj-nP-Tp-tV-Xv-xZz]

%%

<CR>{VOWEL}        {BEGIN 0; printf("%s","av"); ECHO;}
{CONSONANT}        {ECHO; BEGIN CR;}
%%
[moreno@iguanodon lex]$ make french2javanese.out
[moreno@iguanodon lex]$ ./bin/french2javanese 
Bonjour chers etudiants                     
Bavonjavour chavers avetavudaviants
Est-ce que le cours est interessant aujourd'hui ?
avEst-cave qavue lave cavours avest avintaveravessavant avaujavourd'havui ?
Observe that the last line above starts with avEst. Can you explain why ?


AN ENGLISH-TO-FRENCH TRANSLATER FOR THE PASCAL LANGUAGE. Our aim is also to

[moreno@iguanodon lex]$ more test/pascal2pascal.test 
program p;

var i,j : integer;

begin 
   i := 23;
   j := i + i;  
end.

[moreno@iguanodon lex]$ more src/pascal2pascal.l
%{
/* need this for the call to atof() below */
#include <math.h>
#include <stdio.h>

FILE *fic;


%}

PLUS        [\+]
MINUS       [\-]
TIMES       [\*]
BY          [/]
ASSIGN      :=
BINARYOP    {PLUS}|{MINUS}|{TIMES}|{BY}|{ASSIGN}
SEPARATOR   [,:;\.]
PROGRAM     [Pp][Rr][Oo][Gg][Rr][Aa][Mm]
VAR         [Vv][Aa][Rr]
IF          [Ii][Ff]
THEN        [Tt][Hh][Ee][Nn]
ELSE        [Ee][Ll][Ss][Ee]
BEGIN       [Bb][Ee][Gg][Ii][Nn]
END         [Ee][Nn][Dd]
WHILE       [Ww][Hh][Ii][Ll][Ee]
FOR         [Ff][Oo][Rr]
DO          [Dd][Oo]
TO          [Tt][Oo]
FUNCTION    [Ff][Uu][Nn][Cc][Tt][Ii][Oo][Nn]
PROCEDURE   [Pp][Rr][Oo][Cc][Ee][Dd][Uu][Rr][Ee]
LETTER      [A-Za-z]
DIGIT       [0-9]
ID          {LETTER}({LETTER}|{DIGIT})*
INTEGER     ({PLUS}|{MINUS})?{DIGIT}+
REAL        {INTEGER}(\.({DIGIT})*)?([eE]{INTEGER})?
COMMENT     "{"[^}\n]*"}"
%%

{INTEGER}   {
            printf( "An integer: %s (%d)\n", yytext,
                    atoi( yytext ) );
            fprintf(fic, "%d", atoi(yytext));
            }

{REAL}      {
            printf( "A float: %s (%g)\n", yytext,
                    atof( yytext ) );
            fprintf(fic, "%g", atof(yytext));
            }

{IF}        convert_IF();

{THEN}      convert_THEN();

{ELSE}      convert_ELSE();

{BEGIN}     convert_BEGIN();

{END}       convert_END();

{VAR}       convert_VAR();

{FOR}       convert_FOR();

{DO}        convert_DO();

{TO}        convert_TO();

{WHILE}     convert_WHILE();

{PROCEDURE} convert_PROCEDURE();

{FUNCTION}  convert_FUNCTION();

{PROGRAM}   convert_PROGRAM();

{ID}                        {        
            printf( "An identifier: %s\n", yytext );
            fprintf(fic, "%s", yytext );
            }

{SEPARATOR} {
           printf( "A separator: %s\n", yytext );
           fprintf(fic, "%s", yytext );
           }

{BINARYOP}   {
           printf( "A binary operator: %s\n", yytext );
           fprintf(fic, "%s", yytext );
           }

{COMMENT}     {
                  printf( "A comment : %s\n", yytext );
                  fprintf(fic, "%s", yytext );
           }

^[ \t]+          fprintf(fic, "%s", yytext );
[ \t]+           fprintf(fic, "%s", " ");
[\n]+            fprintf(fic, "%s", "\n");



.           printf( "Unrecognized character: %s\n", yytext );

%%

keyword_message() { printf( "A keyword: %s\n", yytext );}

convert_IF() { keyword_message(); fprintf(fic, "%s", "SI"); }
convert_THEN() { keyword_message(); fprintf(fic, "%s", "ALORS"); }
convert_ELSE() { keyword_message(); fprintf(fic, "%s", "SINON"); }
convert_BEGIN() { keyword_message(); fprintf(fic, "%s", "DEBUT") ; }
convert_END() { keyword_message(); fprintf(fic, "%s", "FIN") ; }
convert_VAR() { keyword_message(); fprintf(fic, "%s", "VAR") ; }
convert_FOR() { keyword_message(); fprintf(fic, "%s", "POUR") ; }
convert_DO() { keyword_message(); fprintf(fic, "%s", "FAIRE") ; }
convert_TO() { keyword_message(); fprintf(fic, "%s", "A") ; }
convert_WHILE() { keyword_message(); fprintf(fic, "%s", "TANT QUE") ; }
convert_PROCEDURE() { keyword_message(); fprintf(fic, "%s", "PROCEDURE") ; }
convert_FUNCTION() { keyword_message(); fprintf(fic, "%s", "FONCTION") ; }
convert_PROGRAM() { keyword_message(); fprintf(fic, "%s", "PROGRAMME") ; }




int main() {

     fic = fopen("/tmp/pascal","w");
     
     yylex();

     fclose(fic);
     return 0;
}

[moreno@iguanodon lex]$ more test/pascal2pascal.test 
program p;

var i,j : integer;

begin 
   i := 23;
   j := i + i;  
end.

moreno@iguanodon lex]$ ./bin/pascal2pascal < test/pascal2pascal.test
A keyword: program
An identifier: p
A separator: ;
A keyword: var
An identifier: i
A separator: ,
An identifier: j
A separator: :
An identifier: integer
A separator: ;
A keyword: begin
n identifier: i
A binary operator: :=
An integer: 23 (23)
A separator: ;
An identifier: j
A binary operator: :=
An identifier: i
A binary operator: +
An identifier: i
A separator: ;
A keyword: end
A separator: .
[moreno@iguanodon lex]$ more /tmp/pascal 
PROGRAMME p;
VAR i,j : integer;
DEBUT 
   i := 23;
   j := i + i; 
FIN.

A SCANNER FOR C/JAVA SOURCE FILES We aim to count the number of

[moreno@iguanodon lex]$ more src/C_source_scanner.l
%{
int comments = 0, code = 0, whiteSpace = 0;
%}

%s CS

COMMENT            "/*".*"*/"
COMMENTLINE        ^[ \t]*{COMMENT}[ \t]*\n
WHITELINE          ^[ \t]*\n 
CODESTARTINGLINE   .+({COMMENT}.+)*.*\n 
CODEENDINGLINE     .*({COMMENT}.+)*.+\n
CODELINE           {CODESTARTINGLINE}|{CODEENDINGLINE}

STARTCOMMENTLINE   ^[ \t]*"/*" 

%%

{COMMENTLINE}      {comments++;
                   /* comment on a single line */ 
                   }
{WHITELINE}        {whiteSpace++;}
{CODELINE}         {code++;}

{STARTCOMMENTLINE} {BEGIN CS;
                   /* enter comment eating state */ 
                   }
<CS>"*/"        {BEGIN 0;}
<CS>\n          {comments++ ;}

%%
 
main()    {
               yylex();
               printf("code: %d, comments: %d, white space: %d\n", code, comments, whiteSpace);
              return 0;
}

[moreno@iguanodon lex]$ make C_source_scanner.out  
[moreno@iguanodon lex]$ ./bin/C_source_scanner < src/C_source_scanner.l
code: 26, comments: 2, white space: 8
[moreno@iguanodon lex]$


next up previous
Next: The role of the lexical Up: LEX Previous: How the input is matched
Marc Moreno Maza
2004-12-02