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