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