diff options
Diffstat (limited to 'dviware/crudetype/version3/w2c.lex')
-rw-r--r-- | dviware/crudetype/version3/w2c.lex | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/dviware/crudetype/version3/w2c.lex b/dviware/crudetype/version3/w2c.lex new file mode 100644 index 0000000000..d9dc5d5ed5 --- /dev/null +++ b/dviware/crudetype/version3/w2c.lex @@ -0,0 +1,173 @@ +%{ +#include "w2c.h" +#include "w2cy.h" +#ifdef ANSI +int yylex(void); +#ifndef BSD +static void unput(char); +static int input(void); +#endif +#endif +char conditional[20], negbuf[2], temp[20]; +extern boolean doing_statements; +%} +DIGIT [0-9] +ALPHA [a-zA-Z] +ALPHANUM ({DIGIT}|{ALPHA}) +IDENTIFIER ({ALPHA}{ALPHANUM}*) +NUMBER ({DIGIT}+) +SIGN ("+"|"-") +SIGNED ({SIGN}?{NUMBER}) +WHITE [ \n\t]+ +REAL ({NUMBER}"."{NUMBER}("e"{SIGNED})?)|({NUMBER}"e"{SIGNED}) +COMMENT (("{"[^}]*"}")|("(*"([^*]|"*"[^)])*"*)")) +W ({WHITE}|"packed")+ +WW ({WHITE}|{COMMENT}|"packed")* +HHB0 ("hh"{WW}"."{WW}"b0") +HHB1 ("hh"{WW}"."{WW}"b1") + +%% +{W} ; +"{" {while (input() != '}'); + } +"#" { + register int c; + (void) putc('#', std); + while ((c = input()) && c != ';') + (void) putc(c, std); + (void) putc('\n', std); + } +"ifdef(" {register int c; + register char *cp=conditional; + new_line(); + (void) input(); + while ((c = input()) != '\'') +#ifdef MS_DOS + *cp++ = (char) c; +#else + *cp++ = c; +#endif + *cp = '\0'; + (void) input(); + if (doing_statements) fputs("\t;\n", std); + (void) fprintf(std, + "#ifdef %s\n", conditional); + } +"endif(" {register int c; + new_line(); + fputs("#endif /* ", std); + (void) input(); + while ((c = input()) != '\'') + (void) putc(c, std); + (void) input(); + conditional[0] = '\0'; + fputs(" */\n", std); + } +"forward" return(last_tok=forward_tok) ; +"external" return(last_tok=extern_tok) ; +"@define" return(last_tok=define_tok); +"@field" return(last_tok=field_tok); +"and" return(last_tok=and_tok) ; +"array" return(last_tok=array_tok) ; +"begin" return(last_tok=begin_tok) ; +"case" return(last_tok=case_tok) ; +"const" return(last_tok=const_tok) ; +"div" return(last_tok=div_tok) ; +"break" return(last_tok=break_tok); +"do" return(last_tok=do_tok) ; +"downto" return(last_tok=downto_tok) ; +"else" return(last_tok=else_tok) ; +"end" return(last_tok=end_tok) ; +"file" return(last_tok=file_tok) ; +"for" return(last_tok=for_tok) ; +"function" return(last_tok=function_tok) ; +"goto" return(last_tok=goto_tok) ; +"if" return(last_tok=if_tok) ; +"label" return(last_tok=label_tok) ; +"mod" return(last_tok=mod_tok) ; +"not" return(last_tok=not_tok) ; +"of" return(last_tok=of_tok) ; +"or" return(last_tok=or_tok) ; +"procedure" return(last_tok=procedure_tok) ; +"program" return(last_tok=program_tok) ; +"record" return(last_tok=record_tok) ; +"repeat" return(last_tok=repeat_tok) ; +{HHB0} return(last_tok=hhb0_tok) ; +{HHB1} return(last_tok=hhb1_tok) ; +"then" return(last_tok=then_tok) ; +"to" return(last_tok=to_tok) ; +"type" return(last_tok=type_tok) ; +"until" return(last_tok=until_tok) ; +"var" return(last_tok=var_tok) ; +"with" return(last_tok=with_tok) ; +"new" return(last_tok=new_tok) ; +"while" return(last_tok=while_tok) ; +"others" return(last_tok=others_tok) ; +"write" return(last_tok=write_tok) ; +"writeln" return(last_tok=writeln_tok) ; +{REAL} { + (void) sprintf(temp, "%s%s", negbuf, yytext); + negbuf[0] = '\0'; + return(last_tok=r_num_tok) ; + } +{NUMBER} { + (void) sprintf(temp, "%s%s", negbuf, yytext); + negbuf[0] = '\0'; + return(last_tok=i_num_tok) ; + } +("'"([^']|"''")"'") return(last_tok=single_char_tok) ; +("'"([^']|"''")*"'") return(last_tok=string_literal_tok) ; +"+" { if ((last_tok>=undef_id_tok && + last_tok<=field_id_tok) || + last_tok==i_num_tok || + last_tok==r_num_tok || + last_tok==')' || + last_tok==']') + return(last_tok='+') ; + else return(last_tok=unary_plus_tok) ; } +"-" { if ((last_tok>=undef_id_tok && + last_tok<=field_id_tok) || + last_tok==i_num_tok || + last_tok==r_num_tok || + last_tok==')' || + last_tok==']') + return(last_tok='-') ; + else { + int c; + while ((c = input()) == ' ' || c == '\t'); +#ifdef MS_DOS + unput((char) c); +#else + unput(c); +#endif + if (c < '0' || c > '9') { + return(last_tok = unary_minus_tok); + } + negbuf[0] = '-'; + }} +"*" return(last_tok='*') ; +"/" return(last_tok='/') ; +"=" return(last_tok='=') ; +"<>" return(last_tok=not_eq_tok) ; +"<" return(last_tok='<') ; +">" return(last_tok='>') ; +"<=" return(last_tok=less_eq_tok) ; +">=" return(last_tok=great_eq_tok) ; +"(" return(last_tok='(') ; +")" return(last_tok=')') ; +"[" return(last_tok='[') ; +"]" return(last_tok=']') ; +":=" return(last_tok=assign_tok) ; +".." return(last_tok=two_dots_tok) ; +"." return(last_tok='.') ; +"," return(last_tok=',') ; +";" return(last_tok=';') ; +":" return(last_tok=':') ; +"^" return(last_tok='^') ; +{IDENTIFIER} { (void) strcpy(last_id,yytext) ; + l_s=search_table(last_id) ; + if (l_s) return(last_tok=sym_table[l_s].typ); + else return(last_tok=undef_id_tok); + } +. return(last_tok=unknown_tok) ; +%% |