Exemplo n.º 1
0
int main ( int argc, char** argv )
{
    SchObj robj,ret;
    int    opt;
    char * fname = 0;
    char * expr = 0;

#ifdef USE_BOEHM_GC
    GC_INIT();
#endif
    ensure_init_symtable();
    init_reader();
    init_port();

    flag_use_profiler = 0;

    while ( (opt = getopt(argc,argv,"pf:e:")) != -1 ) {
        switch ( opt ) {
        case 'p': {
            flag_use_profiler = 1;
        } break;
        case 'f': {
            fname = SCH_MALLOC(strlen(optarg) + 1);
            strcpy(fname,optarg);
        } break;
        case 'e':{
            expr = SCH_MALLOC(strlen(optarg) + 1);
            strcpy(expr,optarg);
        }break;
        };
    }

    if ( expr ) {
        robj = sch_read_string(expr);
        ret  = vm_compile(robj);
        SCH_WRITE(ret);
        SCH_DISPLAY(SCH_CHAR('\n'));
    } else if ( fname ) {
        sch_load(SCH_STRING_OBJ(SCH_STRING(fname)));
    } else {
        while ( 1 ) {
            robj = sch_read(NULL);
            ret  = vm_compile(robj);
            SCH_WRITE(ret);
        }
    }

    return 0;

}
Exemplo n.º 2
0
SchObj read_obj( SchPort* port ) {
    unsigned int c;

    do {
        c = SCH_GETC(port);
    } while ( ch_class(c) == CL_WHITESPACE );

    if ( c == ((unsigned char)EOF) ) { /* c -> 0x 00 00 00 ff,  EOF -> 0x ff */
        return SCH_EOF;
    }

    CLEAR_BUF(token_buffer_);

    if ( ch_class(c) == CL_DECIMALNUMBER || c == '-' || c == '+') {

        unsigned int c0 = c;

        PUSH_BUF(token_buffer_,c0);
        c = SCH_GETC(port);

        if ( (c0 == '-' || c0 == '+') && (ch_class(c) != CL_DECIMALNUMBER) ) {
            SCH_UNGETC(c,port);
            return SCH_SYMBOL(TO_S_BUF(token_buffer_));
        }

        while ( ch_class(c) & (CL_DECIMALNUMBER) || c == '.' || c == '/' ) {
            PUSH_BUF(token_buffer_,c);
            c = SCH_GETC(port);
        }

        SCH_UNGETC(c,port);

        return read_number(TO_S_BUF(token_buffer_),10);

    } else if ( ch_class(c) == CL_LIST_END ) {

        return SCH_KOKKA;

    } else if ( ch_class(c) == CL_LIST_BEGIN ) {

        SchObj x      = read_obj(port);
        SchObj p_val  = SCH_LIST1(x);
        SchObj p_last = p_val;

        if ( x == SCH_KOKKA ) {
            return SCH_NIL;
        }

        for (;;) {
            x = read_obj( port );
            if ( x == SCH_KOKKA ) {
                return p_val;
            } else if ( x == SCH_DOT || x == SCH_SYMBOL(".") ) {
                SCH_SET_CDR( p_last, read_obj(port) );
                if ( read_obj( port ) != SCH_KOKKA ) {
                    EXCEPTION("right parenthesis ')' missing");
                }
                return p_val;
            } else {
                SchObj p_y = SCH_LIST1(x);
                SCH_SET_CDR(p_last,p_y);
                p_last = p_y;
            }
        }

    } else if ( c == '"' ) {

        unsigned int prev = c;
        while ( (c = SCH_GETC(port)) != '"' || prev == '\\') {
            if ( prev == '\\' ) {
                switch(c) {
                case '"':
                    POP_BUF(token_buffer_);
                    PUSH_BUF(token_buffer_,'\"');
                    break;
                case 'n':
                    POP_BUF(token_buffer_);
                    PUSH_BUF(token_buffer_,'\n');
                    break;
                case 't':
                    POP_BUF(token_buffer_);
                    PUSH_BUF(token_buffer_,'\t');
                    break;
                default:
                    break;
                }
            } else {
                PUSH_BUF(token_buffer_,c);
            }
            prev = c;
        }
        return SCH_STRING(TO_S_BUF(token_buffer_));

    } else if ( c == '\'' ) {

        return SCH_LIST2(SCH_SYMBOL("quote"),read_obj(port));

    } else if ( c == '`' ) {

        return SCH_LIST2( SCH_SYMBOL("quasiquote"), read_obj(port) );

    } else if ( c == ',' ) {

        if ( (c = SCH_GETC(port)) == '@' ) {
            return SCH_LIST2( SCH_SYMBOL("unquote-splicing"), read_obj(port) );
        } else {
            SCH_UNGETC(c,port);
            return SCH_LIST2( SCH_SYMBOL("unquote"), read_obj(port) );
        }

    } else if ( c == ';' ) {

        while ( (c = SCH_GETC(port)) != '\n' ) {
            if (c == (unsigned char)EOF) { return (SchObj)SCH_EOF; }
        }
        return read_obj( port );

    } else if ( c == '#') {
        return read_sharp_sequence(port);
    } else {

        do {
            PUSH_BUF(token_buffer_,c);
            c = SCH_GETC(port);
        } while ( ch_class(c) & (CL_IDENTIFIER|CL_DECIMALNUMBER) );

        SCH_UNGETC(c,port);

        return SCH_SYMBOL(TO_S_BUF(token_buffer_));
    }

}