Menu

Home

Alexander

<BR><B>LANGUAGE SUPPORT NEXT SYNTAX:</B>

/*
...
*/
... # remark

"parsed text"
'unparsed text'
"parsed 'unparsed'"
; - logical string delimeter

$0 # all parameters as string
$1 # first param (word)
$2
...
$n

$$0 # last result as string
$$1 # first word in string result
...
$3+6 # from 3, 6 parameters
$3-6 # from 3 to last-6 parameters

( ... ) # calculated value, support operators:
e / * % ( ) + - & | ^ l r < > = # see calc.hpp
# all values replaced in execute commands

preprocessor commands: include, def, class, cend, lab, using

include "file1" "file2"
def name value .... ... ; def name2 ...
def $name val
class nameclass
    execute text
    name # return value of name

    def name value
    def name2 value2

    class namesubclass
        def n1 1
        ...
    cend
cend

using nameclass nameclass2 ...

msg text for output
lmsg ", with" " linefeed" ...

verbose 1 # enable debug mode (1/0)

[if/ifn] val; ... [eif/eifn] val; ... else; ... end [val]
if val; ... end 0 # while struct
if 1; ... end val # do ... until struct
if val; ...; end # if struct

lab lab1 # label for goto
if val; goto lab1; else; goto lab2; end
lab lab2

if ("string1" "string2") ... # compare strings

switch val; case v1; ... case v2; ... break
case v3; ret returnvalue; ... default; ... end;

set varname value
set varname varname value2
set $varname value
set varname$varname value # may used as array

save vname; load vname # store/restore last result in variable as is

@'lmsg extract from unparsed string for parse'

lmsg nameclass.namesubclass.n1
lmsg nameclass[value] # 'name by value'

docend [0/1] # skip analize text in preprocess 1 - for all files, 0 - only this file
exit val # end execute with value result
throw message text # cause throw, show stack trace, all variables, defs, labs
trace [0/1] # disable/enable show variables, defs, labs in stack trace

<BR><B>--- IN USER CODE NEED IMPLEMENT NEXT FUNCTIONS: ---</B>

namespace s_lang {
#define _DO(x,y) x[]=y
const char _DEF_OPERATORS;

bool skip_user_interrupt = false;
void script_lang::check_interrupt(execute_env &) {
    if (!skip_user_interrupt) {
        fd_set rfds; struct timeval tv = {0,0}; FD_ZERO(&rfds); FD_SET(STDIN_FILENO, &rfds);
        if (select(STDIN_FILENO + 1, &rfds, NULL, NULL, &tv) && FD_ISSET(STDIN_FILENO, &rfds)) { // cin::not_eof
            std::string line; std::getline(std::cin, line);
            if (line != "") throw new logic_error("user interrupt"); verbose ^= true;
        }
    }
}

void script_lang::get_variable(const n_op_p name, size_t index, string & r) {
    if (name == "$time") { timeval t; gettimeofday(&t, 0);
        stringstream ss; ss << (size_t)((size_t)(t.tv_sec * 1000 + t.tv_usec / 1000) & ((size_t)-1 >> 1)); r=ss.str();
    }
}

int script_lang::atoi(const char * v) { return ::atoi(v); }

bool script_lang::user_parse(const string & str, execute_env & exec) {
    op_p scan(str.c_str()), cmd = scan.get();
    if (cmd == "sleep") { Sleep(atoi(scan.get())); return true; }
    return false;
}

}

int main(...) {
    ....
    ifstream ifs(args.file);
    if (ifs.is_open()){
        lang.parse_stream(ifs, args.file);
        ifs.close();
    } else { cerr << "\n" << pname << ": source file " << args.file << " not opened\n"; }
    return 1;
}