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