<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; }