/* $Id: h-lex.l,v 1.3 1997/07/30 17:46:15 isis Exp $ */ /* * $Log: h-lex.l,v $ * Revision 1.3 1997/07/30 17:46:15 isis * Some minor new features and bug fixes * This seems to work fine * * Revision 1.2 1997/05/25 15:12:26 isis * Bug fixes * mostly with sizeof operator * * Revision 1.1.1.1 1997/05/18 12:15:40 isis * This is the initial distribution * of 'c-headers' using CVS * */ %{ #include #include #include #include #include "Cname.h" #include "symbol.h" #include "h-syn.tab.h" extern int lineno; int attr_paren,cpp_brak; extern SymbolTableClass SymbolTable; extern ErrorHandlerClass ErrorHandler; int search_types(char *); %} %x ATTRIBUTE %x EXTERNCPP %x PRAGMA %% void return T_VOID; int return T_INT; double return T_DOUBLE; float return T_FLOAT; char return T_CHAR; long return TM_LONG; short return TM_SHORT; unsigned return TM_UNSIGNED; signed return TM_SIGNED; __signed__ return TM_SIGNED; struct {yylval.ctype_defstyle=Ctype::STRUCTDEF;return STRUCT;} union {yylval.ctype_defstyle=Ctype::UNIONDEF;return STRUCT;} enum {yylval.ctype_defstyle=Ctype::ENUMDEF;return ENUM;} typedef return TYPEDEF; "extern \"C\"" "extern \"C++\"" {cpp_brak=0;BEGIN(EXTERNCPP);} "{"+ {cpp_brak+=strlen(yytext);} "}" {cpp_brak--;if(cpp_brak==0) BEGIN(INITIAL);} \n lineno++; [^"{""}"]+ extern const return TM_CONST; __const return TM_CONST; __const__ return TM_CONST; static auto inline register volatile __inline __inline__ "..." return THREEDOTS; sizeof return SIZEOF; #pragma BEGIN(PRAGMA); \n {lineno++;BEGIN(INITIAL);} .* __attribute__ {attr_paren=0;BEGIN(ATTRIBUTE);} "("+ {attr_paren+=strlen(yytext);} ")" {attr_paren--;if(attr_paren==0) BEGIN(INITIAL);} \n lineno++; [^"("")"]+ [_A-Za-z]+[_A-Za-z0-9]* return search_types(yytext); [0-9]+ {yylval.number=atoi(yytext);return INT;} "0x"[a-fA-F0-9]+ {sscanf(yytext,"%x",&yylval.number);return INT;} [ \t ]+ \n+ lineno+=strlen(yytext); ">>" return SHL; "<<" return SHR; "<="|"=<" return LE; ">="|"=>" return GE; "==" return EQ; "!=" return NEQ; "&&" return L_AND; "||" return L_OR; . return yytext[0]; %% int search_types(char *str) { SymbolTableEntry *ent; ent=SymbolTable.Lookup(str,SEARCH_ALL_SCOPES); if(ent!=NULL) { if(ent->WhatIs()==TypeEnt) { yylval.type_entry_ptr=(TypeEntry*)ent; return DEFTYPE; } // If not a TypeEnt then an ID } strncpy(yylval.string,yytext,80); return ID; }