LANGUAGE SUPPORT NEXT SYNTAX:
/*
...
*/
... # 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
--- IN USER CODE NEED IMPLEMENT NEXT FUNCTIONS: ---
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;
}