|
| 1 | +%{ |
| 2 | +/* |
| 3 | + * scanner.l |
| 4 | + * |
| 5 | + * lex input file for pascal scanner |
| 6 | + * |
| 7 | + */ |
| 8 | + |
| 9 | +#include <stdio.h> |
| 10 | +#include <string.h> |
| 11 | +#include "parser.h" |
| 12 | + |
| 13 | +int fileno(FILE *); |
| 14 | + |
| 15 | +#define YY_USER_ACTION chr_no += yyleng; // note this line |
| 16 | + |
| 17 | +#define MAX_LINE_LENG 256 |
| 18 | +#define LIST strcat(buffer, yytext) |
| 19 | +#define LIST_FLUSH do{ if(opt_list) printf("%s", buffer); *buffer = 0; }while(0) |
| 20 | +#define LOG(TYPE) do{ LIST; if(opt_token) fprintf(stderr, "token(type:%-10s) on line %4d, %3d : %s\n", #TYPE, line_no, chr_no - yyleng + 1, yytext); } while(0) |
| 21 | + |
| 22 | +int opt_list = 1, opt_token = 0; |
| 23 | +int line_no = 1, chr_no = 0; |
| 24 | +char buffer[MAX_LINE_LENG]; |
| 25 | + |
| 26 | +%} |
| 27 | + |
| 28 | +%option nounput |
| 29 | +%option noinput |
| 30 | + |
| 31 | +A [aA] |
| 32 | +B [bB] |
| 33 | +C [cC] |
| 34 | +D [dD] |
| 35 | +E [eE] |
| 36 | +F [fF] |
| 37 | +G [gG] |
| 38 | +H [hH] |
| 39 | +I [iI] |
| 40 | +J [jJ] |
| 41 | +K [kK] |
| 42 | +L [lL] |
| 43 | +M [mM] |
| 44 | +N [nN] |
| 45 | +O [oO] |
| 46 | +P [pP] |
| 47 | +Q [qQ] |
| 48 | +R [rR] |
| 49 | +S [sS] |
| 50 | +T [tT] |
| 51 | +U [uU] |
| 52 | +V [vV] |
| 53 | +W [wW] |
| 54 | +X [xX] |
| 55 | +Y [yY] |
| 56 | +Z [zZ] |
| 57 | + |
| 58 | +%% |
| 59 | + /* v could do something */ |
| 60 | +{P}{R}{O}{G}{R}{A}{M} {LOG(KEYWORD); return(PROGRAM); } |
| 61 | +{V}{A}{R} {LOG(KEYWORD); return(VAR); } |
| 62 | +{A}{R}{R}{A}{Y} {LOG(KEYWORD); return(ARRAY); } |
| 63 | +{O}{F} {LOG(KEYWORD); return(OF); } |
| 64 | +{I}{N}{T}{E}{G}{E}{R} {LOG(KEYWORD); return(INTEGER); } |
| 65 | +{R}{E}{A}{L} {LOG(KEYWORD); return(REAL); } |
| 66 | +{S}{T}{R}{I}{N}{G} {LOG(KEYWORD); return(STRING); } |
| 67 | +{F}{U}{N}{C}{T}{I}{O}{N} {LOG(KEYWORD); return(FUNCTION); } |
| 68 | +{P}{R}{O}{C}{E}{D}{U}{R}{E} {LOG(KEYWORD); return(PROCEDURE); } |
| 69 | +{B}{E}{G}{I}{N} {LOG(KEYWORD); return(PBEGIN); } |
| 70 | +{E}{N}{D} {LOG(KEYWORD); return(END); } |
| 71 | +{I}{F} {LOG(KEYWORD); return(IF); } |
| 72 | +{T}{H}{E}{N} {LOG(KEYWORD); return(THEN); } |
| 73 | +{E}{L}{S}{E} {LOG(KEYWORD); return(ELSE); } |
| 74 | +{W}{H}{I}{L}{E} {LOG(KEYWORD); return(WHILE); } |
| 75 | +{D}{O} {LOG(KEYWORD); return(DO); } |
| 76 | +{N}{O}{T} {LOG(KEYWORD); return(NOT); } |
| 77 | +{A}{N}{D} {LOG(KEYWORD); return(AND); } |
| 78 | +{O}{R} {LOG(KEYWORD); return(OR); } |
| 79 | + |
| 80 | +"(" {LOG(KEYWORD); return(LPAREN); } |
| 81 | +")" {LOG(KEYWORD); return(RPAREN); } |
| 82 | +";" {LOG(KEYWORD); return(SEMICOLON); } |
| 83 | +"." {LOG(KEYWORD); return(DOT); } |
| 84 | +"," {LOG(KEYWORD); return(COMMA); } |
| 85 | +":" {LOG(KEYWORD); return(COLON); } |
| 86 | +"[" {LOG(KEYWORD); return(LBRACE); } |
| 87 | +"]" {LOG(KEYWORD); return(RBRACE); } |
| 88 | +".." {LOG(KEYWORD); return(DOTDOT); } |
| 89 | +":=" {LOG(KEYWORD); return(ASSIGNMENT); } |
| 90 | +"+" {LOG(KEYWORD); return(ADDOP); } |
| 91 | +"-" {LOG(KEYWORD); return(SUBOP); } |
| 92 | +"*" {LOG(KEYWORD); return(MULOP); } |
| 93 | +"/" {LOG(KEYWORD); return(DIVOP); } |
| 94 | +">" {LOG(KEYWORD); return(GTOP); } |
| 95 | +"<" {LOG(KEYWORD); return(LTOP); } |
| 96 | +"=" {LOG(KEYWORD); return(EQOP); } |
| 97 | +">=" {LOG(KEYWORD); return(GETOP); } |
| 98 | +"<=" {LOG(KEYWORD); return(LETOP); } |
| 99 | +"!=" {LOG(KEYWORD); return(NEQOP); } |
| 100 | + |
| 101 | + /* define identifier here */ |
| 102 | + |
| 103 | + /* define INTEGERNUM, REALNUMBER, SCIENTIFIC here */ |
| 104 | + |
| 105 | + /* define single/multiple line comment here */ |
| 106 | + |
| 107 | + /* define string constant (LITERALSTR) here */ |
| 108 | + |
| 109 | + /* define pragma here */ |
| 110 | + |
| 111 | +[ \t\f\r] LIST; |
| 112 | + |
| 113 | +\n { |
| 114 | + LIST; |
| 115 | + LIST_FLUSH; |
| 116 | + line_no++, chr_no = 0; |
| 117 | +} |
| 118 | + |
| 119 | +. { LIST; fprintf(stderr, "[ERROR] line %4d:%3d lexical analyzer error %s\n", line_no, chr_no-(int)yyleng+1, yytext); } |
0 commit comments