# include # include "constants.h" # include "globals.h" # include "y.tab.h" # include SCCSID(@(#)yylex.c 8.1 12/31/84) /* ** YYLEX -- Lexical analyzer ** Yylex controls the return to the parser of lexemes, ** and the copying out of C_CODE on the all to yylex ** after yylex() returned the C_CODE. ** ** Returns: ** Lexical tokens. ** ** Side Effects: ** Copies C code out on call after seeing it. ** Puts terminals in symbol space. ** ** Called By: ** Yacc internals (yyparse()). */ yylex() { register int rtval; register char chr; /* get next token */ rtval = CONTINUE; while (rtval == CONTINUE) { if (C_code_flg) { copy_c_code(); Newline = 1; } Pre_proc_flg = 0; /* END OF FILE ? */ if ((chr = getch()) == EOF_TOK) { # ifdef xDEBUG if (Lex_debug) printf("end of file\n"); # endif return (0); } /* Test for a line of C code */ if (Newline && if_c_code(chr)) { if (C_code_flg) continue; rtval = Tokens.sp_c_code; C_code_flg = 1; break; } else { C_code_flg = 0; if (Newline) { Newline = 0; continue; } } /* CARRIAGE CONTROL ? */ Newline = chr == '\n'; switch (Cmap [chr]) { case PUNCT : continue; case OPATR : rtval = operator(chr); break; case NUMBR : rtval = number(chr); break; case ALPHA : rtval = name(chr); break; } } if (Lex_debug) printf("YYLEX : '%s'\n", yylval.u_dn ? yylval.u_dn->d_elm : ""); return (rtval); } /* ** COPY_C_CODE -- Copies out a line of C code ** The test for Charcnt != 0 is beacuse if a C pre-processor ** line follows an equel line, and equate_lines() puts out no ** newline, the initial '#' will not be on the beginning of ** the line. As is, if this should happen, then the line ** with the '#' will be one line in the output ahead of ** where it should be. */ copy_c_code() { char ch [2]; ch [1] = 0; equate_lines(); if (Pre_proc_flg) { if (Charcnt != 0) w_raw("\n"); w_raw("#"); } do { if ((*ch = getch()) == EOF_TOK) return; w_raw(ch); } while (*ch != '\n'); } /* ** IF_C_CODE -- Test to see if a line is C code ** ** Sees if a line begins with "##" to see if it is equel. ** ** Parameters: ** chr -- first char of line ** ** Returns: ** 0 -- Quel line ** 1 -- C line ** ** Called By: ** yylex() */ if_c_code(chr) char chr; { for ( ; ; ) { if (chr != '#') { backup(chr); return (1); } Pre_proc_flg = 1; if ((chr = getch()) == EOF_TOK) { return (0); } if (chr != '#') { backup(chr); return (1); } else { return (0); } } }