📄 cparser.c
字号:
/*Copyright (c) 2000, Red Hat, Inc.This file is part of Source-Navigator.Source-Navigator is free software; you can redistribute it and/ormodify it under the terms of the GNU General Public License as publishedby the Free Software Foundation; either version 2, or (at your option)any later version.Source-Navigator is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNUGeneral Public License for more details.You should have received a copy of the GNU General Public License alongwith Source-Navigator; see the file COPYING. If not, write tothe Free Software Foundation, 59 Temple Place - Suite 330, Boston,MA 02111-1307, USA.*/#define VERSION_1#undef VERSION_COMPARE#undef PP_TEST#undef FUNCTION_MACRO#undef TRACE /* ez irja ki a tokeneket */#undef TRACE_FILE /* ezt kell bekapcsolni, hogy a put_symbol jelentesek bekeruljenek a 'cbrowser.trace' file-ba */#undef ARRAY_TEST#undef BETTER_TEST /* azert, hogy a variable declaration is piros legyen */#undef PRINT_TOKEN_LIST#include <stdio.h>#include <string.h>#include <tcl.h>#include <ctype.h>#include "cplex.h"#include "longstr.h"#include "cpdefines.h"#include "sn.h"#define null_safe(x) ((x)==0?"":(x))#define False 0#define True (!False)#define Return( x ) { retval = x; goto return_label; }#define ANONYM "anonymous"#ifndef FUNCTION_MACRO #define step(i) (iva+=(i)) #define token(i) ((ivt<=iva+(i)?f_read(i),0:0), keyw_cpp ? v[(iva+(i))&ZZMASK].yytoken_cpp : v[(iva+(i))&ZZMASK].yytoken ) #define ident(i) ((ivt<=iva+(i)?f_read(i),0:0), v[(iva+i)&ZZMASK].yytext) #define identleng(i) ((ivt<=iva+(i)?f_read(i),0:0), v[(iva+i)&ZZMASK].yytext.leng) #define f_lineno(i) ((ivt<=iva+(i)?f_read(i),0:0), v[(iva+i)&ZZMASK].yylineno) #define f_charno(i) ((ivt<=iva+(i)?f_read(i),0:0), v[(iva+i)&ZZMASK].yycharno)#endif#define Save_d() int iva_save = iva#define Restore_d() iva = iva_save#define GetStatus( depth ) sIfstack[depth].status#define IfstackStatusMax( depth ) sIfstack[depth].status_max#define IfstackElse( depth ) sIfstack[depth]._else#define IfstackUndef( depth ) sIfstack[depth].undef#define DECLARATION_UNKNOWN 0#define DECLARATION_ASM 1#define DECLARATION_TEMPLATE 2#define DECLARATION_LINKAGE_SPECIFICATION 3#define DECLARATION_NAMESPACE 4#define DECLARATION_USING 5#define DECLARATION_OBJECT 6#define LBRACE '{'#define RBRACE '}'#define FUNCTION 1#define POINTER 2#define ARRAY 3#define my_strdup(x) (((x)==0)?0:SN_StrDup(x))#define my_free(x) if(x)ckfree(x)/* #define LongStringsMyInit( plstr ) (LongStringInit(plstr,-1),LongStringMyCopy(plstr,"",-1)) */#define LongStringsMyCopy( plstr1, plstr2 ) (plstr1)->copy((plstr1),(plstr2)->buf, (plstr2)->len )#define LongStringMyCopy( plstr, pc ) (plstr)->copy((plstr), pc, -1 )#define LongStringsMyAppend( plstr1, plstr2 ) (plstr1)->append((plstr1),(plstr2)->buf, (plstr2)->len )#define LongStringMyAppend( plstr, pc ) (plstr)->append((plstr), pc, -1 )#define LongStringMyFree( plstr ) (plstr)->free( plstr );#define LongStringIdCopy( plstr, ident ) { sString_t sString = ident; (plstr)->copy((plstr), sString.text, sString.leng ); }#define LongStringIdAppend( plstr, ident ) { sString_t sString = ident; (plstr)->append((plstr), sString.text, sString.leng ); }#define LongStringMySetLen( plstr, l ) (((plstr)->buf ? (plstr)->buf[l] = 0 : 0), (plstr)->len = (l))extern FILE *cross_ref_fp;typedef struct sDeclaration sDeclaration_t, *Declaration_t;typedef struct sDeclarator sDeclarator_t , *Declarator_t ;typedef struct sClass sClass_t , *Class_t ;typedef struct sEnum sEnum_t , *Enum_t ;typedef struct sArray sArray_t , *Array_t ;struct sArray{ char *string; int changed;};struct sClass{ Class_t ClassParent; LongString name; int access; int lineno_beg; int charno_beg; int lineno_end; int charno_end;};struct sEnum /* struct for enumeration */{ LongString name; int lineno_beg; int charno_beg; int lineno_end; int charno_end;};struct sDeclaration /* struct for declaration */{ Declaration_t Declaration; int type; LongString name; /* space for namespace_name or template_args */ int storage_class; int fct_specifier; int s_const; int s_volatile; int s_char; int s_short; int s_int; int s_long; int s_signed; int s_unsigned; int s_float; int s_double; int s_bool; int s_void; LongString type_name; /* space for typedef_name or class_name to message */ int type_of_type_name; /* SN_CLASS or SN_STRUCT or SN_UNION or SN_ENUM or SN_INTERFACE */ LongString complete_class_name; /* space for complete_class_name */ int lineno_beg; int charno_beg; int lineno_end; int charno_end; sClass_t sClass; sEnum_t sEnum;};struct sDeclarator{ LongString name; LongString type; LongString types; /* falls function definition */ LongString names; /* falls function definition */ int base_typ; int pure; int lineno_beg; int charno_beg; int lineno_end; int charno_end; int name_lineno_beg; int name_charno_beg;};static int depth;struct sIfstack{ int status; int niveau; int status_max; int undef; int _else;};static struct sIfstack sIfstack[1000];#define ZZSIZE (0x10000)#define ZZMASK ( 0xffff)typedef struct{ int yytoken; int yytoken_cpp; sString_t yytext; int yyleng; int yylineno; int yycharno;} ZZSTYPE;char *filename_g;char *classname_g;char *funcname_g;int is_cpp_g; /* are the cpp keywords highlighted ? */int keyw_cpp; /* are the cpp keywords as keywords or identifiers processed ? */int keyw_cpp_orig;int keyw_cpp_cnt; /* how many cpp keyword and operator is already getting */int declaration_try;int mode_g;int pass = 1;int yyfd;extern FILE *hig_fp;static ZZSTYPE v[ ZZSIZE ]; /* value stack */static int ivt; /* index of first empty */static int iva; /* index of 0 */static int niveau;static int bPutSymbol_m;extern int Put_symbol(int type, char *scope, char *sym_name, char *file, int start_lineno, int start_colpos, int end_lineno, int end_colpos, unsigned long attr, char *ret, char *arg_types, char *args, char *reserved, int start_lineno_highlight, int start_colpos_highlight, int end_lineno_highlight, int end_colpos_highlight);extern void declaration( Declaration_t Declaration );extern int _declaration( Declaration_t Declaration );extern int asm_declaration( Declaration_t Declaration );extern int template_declaration( Declaration_t Declaration );extern int extern_declaration( Declaration_t Declaration );extern int linkage_specification( Declaration_t Declaration );extern int using( Declaration_t Declaration );extern int namespace_definition( Declaration_t Declaration );extern int obj_declaration( Declaration_t Declaration );extern int declarator_list( Declaration_t Declaration );extern int declarator( Declarator_t Declarator );extern int declarator_paren( Declarator_t Declarator );extern int declarator_star( Declarator_t Declarator );extern int declarator_identifier( Declarator_t Declarator );extern int declarator_operator( Declarator_t Declarator );extern int declarator_tilde( Declarator_t Declarator );extern int ptr_operator( LongString *plstr );extern void cv_qualifier_list_opt( LongString *plstr );extern int function_or_array_list( Declarator_t Declarator );extern int f_class( Declaration_t Declaration, Class_t Class );extern int base_spec( Class_t Class );extern int base_specifier( Class_t Class );extern int member_list( Class_t Class );extern int member( Class_t Class );extern int member_declaration( Class_t Class );extern int _member_declaration( Class_t Class );extern int member_declarator_list( Class_t Class, Declaration_t Declaration );extern int member_declarator( Declarator_t Declarator );extern int f_enum( Declaration_t Declaration, Enum_t Enum );extern int enum_list( Enum_t Enum );extern int enumerator( Enum_t Enum );extern int operator_function_name( LongString *plstr );extern int conversion_type_name( LongString *plstr );extern int conversion_type_specifier( LongString *plstr );extern int complete_class_name( LongString *plstr );extern void qualified_class_name( LongString *plstr );extern int qualified_name( LongString *plstr, int *plineno, int *pcharno );extern int function_operator( Declarator_t Declarator );extern int array_operator( Declarator_t Declarator );extern void initializer( void );extern void ctor_initializer( void );extern void constant_expression( void );extern int kr_argument_declaration_list( LongString *types, LongString *names );extern int kr_argument_declaration( Array_t ArrayTypes, Array_t ArrayNames );extern int kr_argument_declarator_list( Declaration_t Declaration, Array_t ArrayTypes, Array_t ArrayNames );extern int kr_argument_declarator( Declarator_t Declarator );extern int kr_argument_declarator_paren( Declarator_t Declarator );extern int kr_argument_declarator_star( Declarator_t Declarator );extern int kr_argument_declarator_identifier( Declarator_t Declarator );extern void compound_statement( void );extern void variable( Declaration_t Declaration, Declarator_t Declarator );extern void function( Declaration_t Declaration, Declarator_t Declarator, int lineno_end, int charno_end, int lineno_brace_beg, int charno_brace_beg, char *comment );extern void class_member( Class_t Class, Declaration_t Declaration, Declarator_t Declarator );extern void class_method( Class_t Class, Declaration_t Declaration, Declarator_t Declarator, int lineno_end, int charno_end, int lineno_brace_beg, int charno_brace_beg, char *comment );extern void class_empty_declarator_list( Class_t Class, Declaration_t Declaration );extern void template_argument_skip( LongString *plstr );extern int namespace_name( LongString *plstr );extern void skip_declaration( void );extern int skip_member_declaration( void );extern void function_argument_declaration_list( LongString *types, LongString *names );extern void function_argument_declaration( LongString *types, LongString *names );extern void function_argument_class( int storage_class, LongString *plstr );extern void function_argument_enum( int storage_class, LongString *plstr );extern int function_argument_declarator_one( Declarator_t Declarator );extern void skip_expression( void );extern int function_argument_declarator( Declarator_t Declarator );extern int function_argument_declarator_paren( Declarator_t Declarator );extern int function_argument_declarator_star( Declarator_t Declarator );extern int function_argument_declarator_identifier( Declarator_t Declarator );extern int function_argument_declarator_operator( Declarator_t Declarator );extern int function_argument_declarator_tilde( Declarator_t Declarator );extern int function_argument_function_or_array_list( Declarator_t Declarator );extern int function_argument_function_operator( Declarator_t Declarator );extern int function_argument_array_operator( Declarator_t Declarator );extern int function_argument_base_spec( void );extern unsigned long attr_from_declaration( Declaration_t Declaration );extern void create_type( LongString *type, Declaration_t Declaration, Declarator_t Declarator );#ifndef VERSION_1extern void create_type_argument_list( LongString *type, Declaration_t Declaration, Declarator_t Declarator );#endif /* VERSION_1 */extern char *get_scope( char *name );extern char *get_name( char *name );extern void put_cross1( int type, char *scope, char *sym_name, char *file, int start_lineno, int start_colpos, int end_lineno, int end_colpos, unsigned long attr, char *ret, char *types, char *names, char *reserved );extern int get_struct_name( int *plineno, int *pcharno, sString_t *psString );extern int is_single_parameter_list( LongString *types );extern int array_change_type_and_name( Array_t ArrayTypes, Array_t ArrayNames, char *type, char *name );extern void array_change_not_changed( Array_t ArrayTypes, Array_t ArrayNames );extern Array_t array_create( LongString *plstr );extern void array_destroy( Array_t Array );#ifdef ARRAY_TESTextern void array_print( Array_t Array );#endifextern void array_to_string( LongString *plstr, Array_t Array );extern int skip_macro( int t );extern void skip_macro_2( void ); /* 17.11.97 rigo */extern int skip_member_macro( void );extern char *paf_type_to_string( int paf_type );extern char *get_comment( int lineno );extern char *find_comment( int lineno );extern void init_comment( void ); /* 07.04.97 rigo */extern void flush_comment( void ); /* 08.04.97 */extern char *StringToText( sString_t sString );extern void SetStatus( int depth, int value );extern char *identstring( int i );extern void Put_Macro( Token_t Token );extern void Put_Include( Token_t Token );#ifdef FUNCTION_MACROextern void step( int i );extern int token( int i );extern sString_t ident( int i );extern int identleng( int i );extern int f_lineno( int i );extern int f_charno( int i );#endifextern void f_read( int i );extern void f_read_end( void );extern void HighLightBeg( void );extern void HighLight( void );extern void HighLightEnd( void );extern void start_parser( char *filename_a, int is_cpp, FILE *pf_hig, int mode ){ if( yyfd == -1 ) { return; } init_comment(); /* 07.04.97 rigo */ mode_g = mode; filename_g = filename_a; is_cpp_g = is_cpp; keyw_cpp = is_cpp; /* default keyword processing is equal to default keyword highlighting */ keyw_cpp_orig = keyw_cpp; keyw_cpp_cnt = 0; depth = 0; ivt = 0; /* 12.11.97 rigo */ iva = 0; /* 12.11.97 rigo */ sIfstack[0].status = True; niveau = 0; bPutSymbol_m = True; /* beolvassuk az egesz file-t */ if( f_ReadFile( yyfd )) { return; } if( mode == -1 ) { Token_t Token; while( True ) { int lex; Token = yylex(); lex = Token->lex; f_TokenFreeAll( Token ); if( lex == 0 ) break; } } else { while( token( 0 ) != 0 ) { declaration( 0 ); if( niveau != 0 ) {#ifdef TEST printf( "bad niveau: %d (line:%d)\n", niveau, f_lineno( 0 ));#endif } } } f_read_end();#ifndef PERFORMANCE_TEST f_MacroFreeAll();#endif/* f_TokenCheck(); */ flush_comment(); /* 08.04.97 */}extern void declaration( Declaration_t Declaration ){#ifdef rigo if( keyw_cpp == keyw_cpp_orig ) /* not yet changes */#endif { if( keyw_cpp ) /* we are in cpp mode */ { } declaration_try = 1;/* printf( "first try: %d mode from: %d.%d\n", keyw_cpp, f_lineno(0), f_charno(0) ); */ if( ! _declaration( Declaration )) { keyw_cpp = ! keyw_cpp; declaration_try = 2;/* printf( "second try: %d mode from: %d.%d\n", keyw_cpp, f_lineno(0), f_charno(0) ); */ if( _declaration( Declaration )) {#ifdef TEST printf( "change mode: %s (%d.%d)\n" , filename_g , f_lineno(0) , f_charno(0) );#endif } else { keyw_cpp = ! keyw_cpp; /* restore mode *//* printf( "third try: %d mode from: %d.%d\n", keyw_cpp, f_lineno(0), f_charno(0) ); */ declaration_try = 3; if( ! _declaration( Declaration )) { skip_declaration(); } } } }#ifdef rigo else /* already changed */ { declaration_try = 3; if( ! _declaration( Declaration ))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -