%{ #include #include #include"symtab.h" int last_state=0; int arg_depth=0; int ifgrp_flg=1; %} /*regular definitions*/ /*punctuators*/ punct [\[\]\(\)\{\}\.&\*\+\-~!/%<>\^\|\?:;=,#]|"++"|"->"|"--"|"<="|">="|"=="|"!="|"&&"|"||"|"..."|"*="|"/="|"%="|"+="|"-="|"<<"|">>"|"<<="|">>="|"&="|"^="|"|="|"##"|"<:"|":>"|"<%"|"%>"|"%:"|"%:%:" /*Character-Constants*/ octdigit [0-7] oct_esc_seq "\\"{octdigit}{octdigit}?{octdigit}? hexdigit [0-9a-fA-F] hex_esc_seq "\\x"{hexdigit}+ simple_esc_seq "\\'"|"\\\""|"\\\?"|"\\\\"|"\\a"|"\\b"|"\\f"|"\\n"|"\\r"|"\\t"|"\\v" esc_seq {simple_esc_seq}|{hex_esc_seq}|{oct_esc_seq} c_char [^'\\n]|{esc_seq} c_char_seq {c_char}+ char_const "'"{c_char_seq}"'"|L"'"{c_char_seq}"'" /*integer-constants*/ nzdigit [1-9] digit [0-9] hex_prfx 0x|0X unsgn_sfx [uU] long_sfx [lL] long2_sfx ll|LL int_sfx {unsgn_sfx}{long_sfx}?|{unsgn_sfx}{long2_sfx}?|{long_sfx}{unsgn_sfx}?|{long2_sfx}{unsgn_sfx}? hex_const {hex_prfx}{hexdigit}+ oct_const 0{octdigit}+ dec_const {nzdigit}{digit}+ int_const ({dec_const}|{oct_const}|{hex_const}){int_sfx}? /*floating-constants*/ float_sfx f|l|F|L hexdigit_seq {hexdigit}+ digit_seq {digit}+ sign +|- exp_part (e|E){sign}?{digit_seq} bin_exp_part (p|P){sign}?{digit_seq} frac_const {digit_seq}?"."{digit_seq}|{digit_seq}"." hex_frac_const {hexdigit_seq}?"."{hexdigit_seq}|{hexdigit_seq}"." dec_float_const ({frac_const}|{digit_seq}){exp_part}?{float_sfx}? hex_float_const {hex_prfx}({hex_frac_seq}|{hexdigit_seq}){bin_exp_part}{float_sfx}? float_const {dec_float_const}|{hex_float_const} /*enumeration-constants*/ enum_const {iden} /*constants*/ constant {int_const}|{float_const}|{enum_const}|{char_const} /*identifiers*/ nondigit [_a-zA-Z] hex_quad {hexdigit}{hexdigit}{hexdigit}{hexdigit} univ_char_name "\\u"{hex_quad})|("\\U"{hex_quad}{hex_quad} iden_nondigit {nondigit}|{univ_char_name} iden {iden_nondigit}({iden_nondigit}|{digit})* /*string-literals*/ s_char [^\n\"\\]|{esc_seq} s_char_seq {s_char}+ str_lit "\""{s_char_seq}?"\""|L"\""{s_char_seq}?"\"" /*header names*/ %x HEADER q_char [^\n\"] q_char_seq {q_char}+ h_char [^\n>] h_char_seq {h_char}+ header_name "<"{h_char_seq}">"|"\""{q_char_seq}"\"" /*pp-number*/ pp_num "\."?{digit}({digit}?{iden_nondigit}?((e|E){sign})?)* /* ({digit}?{iden_nondigit}?((e|E|p|P){sign})?("\.")?)* */ /*white-space*/ ws [ \t\v\f]+ /*keywords*/ keyword (auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|restrict|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while|_Bool|_Complex|_Imaginary) /*comment*/ %x BCOMMENT LCOMMENT %x PPD DEFN OBJMACRO FNCMACRO1 FNCMACRO2 REPLIST PARAMLIST MACROCALL %x IFDF IFDF_LN IFNDF IFNDF_LN ELSE_LN EXPR %% { [^*\n]* {ECHO;/*eat anything that's not a '*' */} "*"+[^*/\n]* {ECHO;/*eat up '*'s not followed by '/'s */} "\n" {ECHO;} "*"+"/" {ECHO;BEGIN(last_state);} } { .* {ECHO;} "\n" {BEGIN(INITIAL);return '\n';} } { "\n" {} "(" { ECHO; --arg_depth; return PUNCT; } ")" { ECHO; ++arg_depth; if(arg_depth>=0) BEGIN(INITIAL); return PUNCT; } {iden} {ECHO;return ID;} {char_const} {ECHO;return CCNST;} {punct} {ECHO;return PUNCT;} {pp_num} {ECHO;return PPNUM;} [^ \t\n\v\f] {ECHO;return NWSC;} {str_lit} {ECHO;return SLIT;} {ws} {printf(" ");return WS;} } { {iden} { ECHO; if(ifgrp_flg==1) { symrec *tmp=lookup(yytext); if(tmp!=NULL) { if(tmp->type==DFN) BEGIN(MACROCALL); } return ID; } } {char_const} { ECHO; if(ifgrp_flg==1) return CCNST; } {punct} { ECHO; if(ifgrp_flg==1) return PUNCT; } {pp_num} { ECHO; if(ifgrp_flg==1) return PPNUM; } ^([ \t]*)#/([ \t]*(define|include|undef|line|error|pragma)) { ECHO; if(ifgrp_flg==1) { BEGIN(PPD); return '#'; } } ^([ \t]*)#/([ \t]*(ifdef|ifndef|endif|else|if)) {ECHO;BEGIN(PPD);return '#';} [^ \t\n\v\f] { ECHO; if(ifgrp_flg==1) return NWSC; } {str_lit} { ECHO; if(ifgrp_flg==1) return SLIT; } {ws} { printf(" "); if(ifgrp_flg==1) return WS; } } { "define" {ECHO;BEGIN(DEFN);return DEFINE;} "include" {ECHO;BEGIN(HEADER);return INCLUDE;} "undef" {ECHO;return UNDEF;} "line" {ECHO;return LINE;} "error" {ECHO;return ERR;} "pragma" {ECHO;return PRAGMA;} "ifdef" {ECHO;BEGIN(IFDF);return IFDEF;} "ifndef" {ECHO;BEGIN(IFNDF);return IFNDEF;} "if" {ECHO;BEGIN(EXPR);return IF;} "endif" { ECHO; ifgrp_flg=1; return ENDIF; } "else" { ECHO; ifgrp_flg=!ifgrp_flg; BEGIN(ELSE_LN); return ELSE; } }
{header_name} {ECHO;BEGIN(INITIAL);return HDRNM;} [ \t]* {} { {iden}/[ \t]*\n { ECHO; symrec *tmp=lookup(yytext); if(tmp==NULL) ifgrp_flg=0; BEGIN(IFDF_LN); return ID; } } { {iden}/[ \t]*\n { ECHO; symrec *tmp=lookup(yytext); if(tmp!=NULL) ifgrp_flg=0; BEGIN(IFNDF_LN); return ID; } } [ \t]*\n {BEGIN(INITIAL);return '\n';} { {iden} {ECHO;BEGIN(OBJMACRO);return ID;} {iden}/"(" {ECHO;BEGIN(FNCMACRO1);return ID;} } { {iden} {ECHO;BEGIN(REPLIST);return ID;} {char_const} {ECHO;BEGIN(REPLIST);return CCNST;} {punct} {ECHO;BEGIN(REPLIST);return PUNCT;} {pp_num} {ECHO;BEGIN(REPLIST);return PPNUM;} [^ \t\n\v\f] {ECHO;BEGIN(REPLIST);return NWSC;} } "(" {BEGIN(PARAMLIST);return '(';} { {iden} {ECHO;BEGIN(REPLIST);return ID;} {char_const} {ECHO;BEGIN(REPLIST);return CCNST;} {punct} {ECHO;BEGIN(REPLIST);return PUNCT;} {pp_num} {ECHO;BEGIN(REPLIST);return PPNUM;} [^ \t\n\v\f] {ECHO;BEGIN(REPLIST);return NWSC;} } { {iden} {ECHO;return ID;} "," {ECHO;return ',';} ")" {BEGIN(FNCMACRO2);return ')';} } { {ws} {ECHO;return WS;} {iden} {ECHO;return ID;} {char_const} {ECHO;return CCNST;} {punct} {ECHO;return PUNCT;} {pp_num} {ECHO;return PPNUM;} [^ \t\n\v\f] {ECHO;return NWSC;} {str_lit} {ECHO;return SLIT;} } <*>[ \t]*"\n" { ECHO; if(ifgrp_flg==1) { BEGIN(INITIAL); return '\n'; } } <*>.*"\\\n" {ECHO; int i; char *yycopy = strdup( yytext ); for ( i = yyleng - 3; i >= 0; --i ) unput( yycopy[i] ); free( yycopy ); } <*>"/*" {ECHO;last_state=YYSTATE;BEGIN(BCOMMENT);} <*>"//" {ECHO;last_state=YYSTATE;BEGIN(LCOMMENT);} %% /*eof*/