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