Click here to Skip to main content
15,885,309 members
Articles / Programming Languages / C++

Building a simple C++ script compiler from Scintilla and CINT

Rate me:
Please Sign up or sign in to vote.
4.73/5 (25 votes)
8 Jul 2006CPOL7 min read 153.9K   7.6K   85  
How to build a simple C++ script compiler from Scintilla and CINT.
CINT(API) 


CAUTION:  Please refer to doc/ref.txt. This file is getting old.


 This document describes CINT C/C++ interpreter API functions.



CINT API functions
        Following  functions  are  supplied by cint for debugging
       and source code analysis purposes.

            char *G__input(const char *prompt);
            int G__pause();
            int G__tracemode(int on_off);
            int G__setbreakpoint(char *breakline,char *breakfile);
            int G__stepmode(int on_off);
            [anytype] G__calc(const char *expression);
            [anytype] G__exec_tempfile(const char *file);
            int G__loadfile(const char *file);
            int G__unloadfile(const char *file);
            int G__reloadfile(const char *file);
            char *G__search_next_member(const char *name,int state);
            void *G__what_type(const char *name,char *type,char *tagname,char *typename);
            int G__lock_variable(char *varname);
            int G__unlock_variable(char *varname);
            G__graph(double xdata[],double ydata[],int ndata,char *title,int mode);

# char *G__input(const char *prompt);

        G__input() reads keyboard input. It  returns  pointer  to
       char  declared  as  static  opject  in G__pause(). So, the
       returned pointer must not be freed.

            main() {  // example program
                 char *command;
                 while(1) {
                      command = G__input("input command > ");
                      if(strcmp(command,"exit")==0) exit();
                      system(command);
                 }
            }

# int G__pause();

       When  G__pause()  is  called,  interactive  interface  is
       started.   Debug commands can be used.  G__pause() returns
       1 if 'I' command is given.   So  you  can  repeat  calling
       G__pause() until 'i' input by following example.

         while(G__pause()==0);

# int G__tracemode(int on_off);

      G__tracemode() sets trace mode.

# int G__breakline(int line);

      G__breakline()  sets break point.  If 0 is given as argument, 
      break point is cleared.

# int G__stepmode(int on_off);

       G__stepmode() switchs on/off step execution mode.


# [anytype] G__calc(char *expression);

        G__calc() evaluates C expression.  It returns the type of
       object  the  argument  expression  returns.  Variables and
       function calls can be used in  the  expression.   Declara-
       tion,  loop  and  conditional statement can not be used in
       the expression.

            int i;
            double a;
            i = G__calc("1+2+3");  // returns int
            a = G__calc("3.14*i");  // returns double

# [anytype] G__exec_tempfile(char *file);

        G__exec_tempfile() opens temporal source file and execute
       it  in  the  current  context.   The tempfile can contain,
       variable   declaration,   struct,union,enum    definition.
       expression,  loop and control statement and cannot contain
       function definition.  G__exec_tempfile() executes a state-
       ment or statement list surrounded by '{' , '}' and returns
       the last evaluated value.

            {    // example of tempfile
                 int i;
                 double ary[100];
                 for(i=0;i<100;i++) ary[i] = i;
            }

       Then in the main program, you can execute above  statement
       by G__exec_tempfile.


# int G__loadfile(const char *file);

        G__loadfile() incrementally loads source file. If file

# int G__unloadfile(const char *file);

        G__unloadfile()  unloads source file. If any of the func-
       tions  included  in  the  file  is  busy,  G__unloadfile()
       returns error code (-1) and won't unload it.

# int G__reloadfile(const char *file);

        G__reloadfile() does G__unloadfile() and G__loadfile() at
       once.

# char *G__search_next_member(const char *name,int state);

        G__search_next_member() searches for function  and  vari-
       able  name in current scope which start with name. state=0
       must be given at the first call of G__search_next_member()
       for  initialization.  In consequitive calls, state must be 1.
        G__search_next_member() returns malloced pointer. If  you
       call  this  function, you must free() the returned pointer
       afterwards.

# void *G__what_type(const char *name,char *type,char  *tagname
                     ,char *typename);

        G__what_type()  returns  pointer  and type information of
       the object of name.  Sufficient length of  string  pointer
       must be given to typa,tagname and typename argument.

# int  G__lock_variable(char  *varname); 
# int G__unlock_variable(char *varname);

       (THIS CAPABILITY IS OBSOLETED IN CINT-5.14.5)
        G__lock_variable()   and   G__unlock_variable()   control
       assignment  locking.  Assignement to specific variable can
       be locked/unlocked.

# G__graph(double  xdata[],double   ydata[],int   ndata,char *title,int mode);

        G__graph()  uses  xgraph  to  plot 2 dimentinal graph. If
       mode is 0, G__graph() waits for xgraph process to be  ter-
       minated. If mode is 1, xgraph becomes a background job. If
       mode is 3, G__graph() appends x and y data  to  "G__graph"
       file and will not invoke xgraph process.



# ERTTI (Extensive Run Time Type Identification)
        Many people are interested in Cint as basement for build-
       ing class browser or program analyzer. For  those  people,
       ERTTI  API which gives an access to Cint's symbol table is
       a useful interface. Information about ERTTI is  documented
       in doc/ref.txt



# pragma compile
        Source  file  can  be partially compiled by '#pragma com-
       pile' statement.  In the following example, 'int globals;'
       and  'func()'  are  compiled  when they are updated.  When
       this program  is  first  executed  by  cint,  makecint  is
       invoked  and  source  code surrounded by '#pragma compile'
       and '#pragma endcompile' will be compiled into  a  dynamic
       link library 'G__autocc.sl'. The G__autocc.sl is automati-
       cally loaded and compiled version of 'func()' will be exe-
       cuted.
        This feature is only available on HP-UX 8.0 or later ver-
       sion.

            // #pragma disablecomppile
            #pragma compile
            int globals; /* this global variable is compiled */
            #pragma endcompile

            main(int argc,char **argv) {
                 func(argv[1]);
            }

            #pragma compile
            int func(char *string)
            {
                 /* this function is compiled and dynamically linked */
            }


    #pragma compile
        Specifies beginning of compiled  section  which  must  be
       ended by '#pragma endcompile'. Multiple compile,endcompile
       pair can appear in the source code.

    #pragma endcompile
        Specifies end of compiled section.

    #pragma disablecompile
        Turn off '#pragma compile'. Pragma compile is  turned  on
       by  default. '#pragma disablecompile' must be described if
       you turn off the mode.

    #pragma enablecompile
        Turn on '#pragma compile'.




Undeclared symbol
        Cint can execute C code which  includes  undeclared  sym-
       bols.   Undeclared  symbols  are  detected  and handled by
       interpreter at run time.  As cint detects undeclared  sym-
       bols, warning message is printed out and execution will be
       continued.

       Assigning to undeclared variable:
        If assignment to undeclared variable appears, cint  allo-
       cates  automatic  variable.  If assignment value is double
       or float, double type variable is  allocated.   Otherwise,
       int  type  variable  is allocated.  For example, following
       program works as intended.

            main() {
                 double dat[10];
                 for(i=0;i<10;i++) {    /* i allocated as int */
                      dat[i]=i;
                      sum += dat[i]; /* sum allocated as double */
                 }
                 printf("sum=%g\n",sum);
            }

       If undeclared symbol first appears as array form, array of
       appropriate  size  will  be  allocated.   For  example, if
       'data[1][10]=3.14' appears without declaration of 'data' ,
       'double  data[2][11]'  is allocated and 'data[1][10]=3.14'
       is assigned.  Array can not be expanded  after  the  auto-
       matic  allocation.  So, 'data[2][15]=15;' will be rejected
       because array index is out of range.

            main() {
                 data[1][10]=3.14;  // double data[2][11]; data[1][10]=3.14;
                 data[0][3]=153.3;  // OK
                 data[2][15]=-15.0; // rejected, array can not be expanded
            }

       Pointer to automatically allocated  variable  can  not  be
       used.   If  undeclared  variable  appears with referencing
       operator '*' or '&', these operators are ignored.

       Referencing undeclared variable:
        If undeclared variable is referenced, cint  returns  NULL
       or zero as its value.

       Undeclared function:
        If  undeclared  function is called, it is simply skipped.
       Parameter list will be evaluated.

            main() {
                 int i=0;
                 undeclaredfunc(i++); // function call skipped
                 // i is 1 here because i++ was evaluated above
            }





BUGS
        Report  bugs  and  requirements  to cint@pcroot.cern.ch. Bugs
       tend to be fixed very quickly. Any  kind  of  comments  or
       messages will be appreciated.

SEE ALSO
            doc/makecint.txt 


AUTHOR
       Masaharu Goto  (cint@pcroot.cern.ch)
       Copyright  (c)  1995~1999 Masaharu Goto
















































2                            function                           6

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior)
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions