xref: /minix3/external/bsd/flex/dist/examples/manual/pascal.lex (revision 357f1050293be536ca8309aae20889945ce99fc1)
1*357f1050SThomas Veerman /*
2*357f1050SThomas Veerman  * pascal.lex: An example PASCAL scanner
3*357f1050SThomas Veerman  *
4*357f1050SThomas Veerman  */
5*357f1050SThomas Veerman 
6*357f1050SThomas Veerman %{
7*357f1050SThomas Veerman #include <stdio.h>
8*357f1050SThomas Veerman #include "y.tab.h"
9*357f1050SThomas Veerman 
10*357f1050SThomas Veerman int line_number = 0;
11*357f1050SThomas Veerman 
12*357f1050SThomas Veerman void yyerror(char *message);
13*357f1050SThomas Veerman 
14*357f1050SThomas Veerman %}
15*357f1050SThomas Veerman 
16*357f1050SThomas Veerman %x COMMENT1 COMMENT2
17*357f1050SThomas Veerman 
18*357f1050SThomas Veerman white_space       [ \t]*
19*357f1050SThomas Veerman digit             [0-9]
20*357f1050SThomas Veerman alpha             [A-Za-z_]
21*357f1050SThomas Veerman alpha_num         ({alpha}|{digit})
22*357f1050SThomas Veerman hex_digit         [0-9A-F]
23*357f1050SThomas Veerman identifier        {alpha}{alpha_num}*
24*357f1050SThomas Veerman unsigned_integer  {digit}+
25*357f1050SThomas Veerman hex_integer       ${hex_digit}{hex_digit}*
26*357f1050SThomas Veerman exponent          e[+-]?{digit}+
27*357f1050SThomas Veerman i                 {unsigned_integer}
28*357f1050SThomas Veerman real              ({i}\.{i}?|{i}?\.{i}){exponent}?
29*357f1050SThomas Veerman string            \'([^'\n]|\'\')+\'
30*357f1050SThomas Veerman bad_string        \'([^'\n]|\'\')+
31*357f1050SThomas Veerman 
32*357f1050SThomas Veerman %%
33*357f1050SThomas Veerman 
34*357f1050SThomas Veerman "{"                  BEGIN(COMMENT1);
35*357f1050SThomas Veerman <COMMENT1>[^}\n]+
36*357f1050SThomas Veerman <COMMENT1>\n            ++line_number;
37*357f1050SThomas Veerman <COMMENT1><<EOF>>    yyerror("EOF in comment");
38*357f1050SThomas Veerman <COMMENT1>"}"        BEGIN(INITIAL);
39*357f1050SThomas Veerman 
40*357f1050SThomas Veerman "(*"                 BEGIN(COMMENT2);
41*357f1050SThomas Veerman <COMMENT2>[^)*\n]+
42*357f1050SThomas Veerman <COMMENT2>\n            ++line_number;
43*357f1050SThomas Veerman <COMMENT2><<EOF>>    yyerror("EOF in comment");
44*357f1050SThomas Veerman <COMMENT2>"*)"       BEGIN(INITIAL);
45*357f1050SThomas Veerman <COMMENT2>[*)]
46*357f1050SThomas Veerman 
47*357f1050SThomas Veerman  /* note that FILE and BEGIN are already
48*357f1050SThomas Veerman   * defined in FLEX or C so they can't
49*357f1050SThomas Veerman   * be used. This can be overcome in
50*357f1050SThomas Veerman   * a cleaner way by defining all the
51*357f1050SThomas Veerman   * tokens to start with TOK_ or some
52*357f1050SThomas Veerman   * other prefix.
53*357f1050SThomas Veerman   */
54*357f1050SThomas Veerman 
55*357f1050SThomas Veerman and                  return(AND);
56*357f1050SThomas Veerman array                return(ARRAY);
57*357f1050SThomas Veerman begin                return(_BEGIN);
58*357f1050SThomas Veerman case                 return(CASE);
59*357f1050SThomas Veerman const                return(CONST);
60*357f1050SThomas Veerman div                  return(DIV);
61*357f1050SThomas Veerman do                   return(DO);
62*357f1050SThomas Veerman downto               return(DOWNTO);
63*357f1050SThomas Veerman else                 return(ELSE);
64*357f1050SThomas Veerman end                  return(END);
65*357f1050SThomas Veerman file                 return(_FILE);
66*357f1050SThomas Veerman for                  return(FOR);
67*357f1050SThomas Veerman function             return(FUNCTION);
68*357f1050SThomas Veerman goto                 return(GOTO);
69*357f1050SThomas Veerman if                   return(IF);
70*357f1050SThomas Veerman in                   return(IN);
71*357f1050SThomas Veerman label                return(LABEL);
72*357f1050SThomas Veerman mod                  return(MOD);
73*357f1050SThomas Veerman nil                  return(NIL);
74*357f1050SThomas Veerman not                  return(NOT);
75*357f1050SThomas Veerman of                   return(OF);
76*357f1050SThomas Veerman packed               return(PACKED);
77*357f1050SThomas Veerman procedure            return(PROCEDURE);
78*357f1050SThomas Veerman program              return(PROGRAM);
79*357f1050SThomas Veerman record               return(RECORD);
80*357f1050SThomas Veerman repeat               return(REPEAT);
81*357f1050SThomas Veerman set                  return(SET);
82*357f1050SThomas Veerman then                 return(THEN);
83*357f1050SThomas Veerman to                   return(TO);
84*357f1050SThomas Veerman type                 return(TYPE);
85*357f1050SThomas Veerman until                return(UNTIL);
86*357f1050SThomas Veerman var                  return(VAR);
87*357f1050SThomas Veerman while                return(WHILE);
88*357f1050SThomas Veerman with                 return(WITH);
89*357f1050SThomas Veerman 
90*357f1050SThomas Veerman "<="|"=<"            return(LEQ);
91*357f1050SThomas Veerman "=>"|">="            return(GEQ);
92*357f1050SThomas Veerman "<>"                 return(NEQ);
93*357f1050SThomas Veerman "="                  return(EQ);
94*357f1050SThomas Veerman 
95*357f1050SThomas Veerman ".."                 return(DOUBLEDOT);
96*357f1050SThomas Veerman 
97*357f1050SThomas Veerman {unsigned_integer}   return(UNSIGNED_INTEGER);
98*357f1050SThomas Veerman {real}               return(REAL);
99*357f1050SThomas Veerman {hex_integer}        return(HEX_INTEGER);
100*357f1050SThomas Veerman {string}             return{STRING};
101*357f1050SThomas Veerman {bad_string}         yyerror("Unterminated string");
102*357f1050SThomas Veerman 
103*357f1050SThomas Veerman {identifier}         return(IDENTIFIER);
104*357f1050SThomas Veerman 
105*357f1050SThomas Veerman [*/+\-,^.;:()\[\]]   return(yytext[0]);
106*357f1050SThomas Veerman 
107*357f1050SThomas Veerman {white_space}        /* do nothing */
108*357f1050SThomas Veerman \n                   line_number += 1;
109*357f1050SThomas Veerman .                    yyerror("Illegal input");
110*357f1050SThomas Veerman 
111*357f1050SThomas Veerman %%
112*357f1050SThomas Veerman 
113*357f1050SThomas Veerman void yyerror(char *message)
114*357f1050SThomas Veerman {
115*357f1050SThomas Veerman    fprintf(stderr,"Error: \"%s\" in line %d. Token = %s\n",
116*357f1050SThomas Veerman            message,line_number,yytext);
117*357f1050SThomas Veerman    exit(1);
118*357f1050SThomas Veerman }
119*357f1050SThomas Veerman 
120*357f1050SThomas Veerman 
121