mirror of
https://github.com/correl/mercenary.git
synced 2024-11-23 11:09:50 +00:00
Now supports the value concatenation operator "$+"
git-svn-id: file:///srv/svn/ircclient/trunk@7 a9804ffe-773b-11dd-bd7c-89c3ef1d2733
This commit is contained in:
parent
34b445fe87
commit
c720c5aa5e
4 changed files with 44 additions and 13 deletions
|
@ -210,7 +210,12 @@ bool MessageHandler::call_alias(QString alias, QStringList args) {
|
||||||
} else if( alias == "quit" || alias == "q" ) {
|
} else if( alias == "quit" || alias == "q" ) {
|
||||||
if( args.count() > 0 ) { irc->quit( args.join( " " ) ); }
|
if( args.count() > 0 ) { irc->quit( args.join( " " ) ); }
|
||||||
else { irc->quit(); }
|
else { irc->quit(); }
|
||||||
|
} else if(alias == "echo") {
|
||||||
|
windows["status"]->echo(args.join(" "));
|
||||||
} else {
|
} else {
|
||||||
|
//TODO: Script error! Unknown alias.... WHEREVER WE ARE IN WHICHEVER SCRIPT IT IS THAT WE'RE RUNNING!!
|
||||||
|
//BUT WAIT!!!!! NO!!!! The script manager is the only thing handling that!!!
|
||||||
|
//IN FACT, ALL THE ABOVE ALIASES BELONG IN THE IRC CLIENT LIBRARY, REALLY! PERHAPS?
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -41,7 +41,8 @@ typedef QMap<QString, mirc_alias> mirc_aliases;
|
||||||
|
|
||||||
enum mirc_engine_stage {
|
enum mirc_engine_stage {
|
||||||
PARSE,
|
PARSE,
|
||||||
EXECUTE
|
EXECUTE,
|
||||||
|
TERMINATED
|
||||||
};
|
};
|
||||||
|
|
||||||
class mirc_script_engine : public QObject {
|
class mirc_script_engine : public QObject {
|
||||||
|
@ -50,6 +51,7 @@ private:
|
||||||
MIRCScriptManager *manager;
|
MIRCScriptManager *manager;
|
||||||
mirc_aliases::iterator current_alias;
|
mirc_aliases::iterator current_alias;
|
||||||
mirc_variables::iterator current_variable;
|
mirc_variables::iterator current_variable;
|
||||||
|
QStringList current_value;
|
||||||
QStack<QStringList> stack;
|
QStack<QStringList> stack;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -69,6 +71,7 @@ public:
|
||||||
void declare_variable(char const* str, char const* end);
|
void declare_variable(char const* str, char const* end);
|
||||||
void assign_variable(char const* str, char const* end);
|
void assign_variable(char const* str, char const* end);
|
||||||
void fetch_variable(char const*, char const*);
|
void fetch_variable(char const*, char const*);
|
||||||
|
void append_value(char const* str, char const *end);
|
||||||
void append_expression(char const* str, char const *end);
|
void append_expression(char const* str, char const *end);
|
||||||
void clear_stack(char const*, char const*);
|
void clear_stack(char const*, char const*);
|
||||||
};
|
};
|
||||||
|
@ -84,8 +87,10 @@ struct mirc_script : public grammar<mirc_script> {
|
||||||
struct definition {
|
struct definition {
|
||||||
rule<ScannerT> script,
|
rule<ScannerT> script,
|
||||||
space,
|
space,
|
||||||
|
nospace,
|
||||||
identifier,
|
identifier,
|
||||||
string,
|
string,
|
||||||
|
value,
|
||||||
expression,
|
expression,
|
||||||
expression_group,
|
expression_group,
|
||||||
parameters,
|
parameters,
|
||||||
|
@ -109,6 +114,7 @@ struct mirc_script : public grammar<mirc_script> {
|
||||||
s_action v_def ( bind( &mirc_script_engine::declare_variable, self.actions, _1, _2 ) );
|
s_action v_def ( bind( &mirc_script_engine::declare_variable, self.actions, _1, _2 ) );
|
||||||
s_action v_assign ( bind( &mirc_script_engine::assign_variable, self.actions, _1, _2 ) );
|
s_action v_assign ( bind( &mirc_script_engine::assign_variable, self.actions, _1, _2 ) );
|
||||||
s_action v_fetch ( bind( &mirc_script_engine::fetch_variable, self.actions, _1, _2 ) );
|
s_action v_fetch ( bind( &mirc_script_engine::fetch_variable, self.actions, _1, _2 ) );
|
||||||
|
s_action v_append ( bind( &mirc_script_engine::append_value, self.actions, _1, _2 ) );
|
||||||
s_action e_append ( bind( &mirc_script_engine::append_expression, self.actions, _1, _2 ) );
|
s_action e_append ( bind( &mirc_script_engine::append_expression, self.actions, _1, _2 ) );
|
||||||
s_action s_code ( bind( &mirc_script_engine::store_code, self.actions, _1, _2 ) );
|
s_action s_code ( bind( &mirc_script_engine::store_code, self.actions, _1, _2 ) );
|
||||||
s_action c_stack ( bind( &mirc_script_engine::clear_stack, self.actions, _1, _2 ) );
|
s_action c_stack ( bind( &mirc_script_engine::clear_stack, self.actions, _1, _2 ) );
|
||||||
|
@ -124,17 +130,24 @@ struct mirc_script : public grammar<mirc_script> {
|
||||||
| str_p("$&") >> *blank_p >> eol_p
|
| str_p("$&") >> *blank_p >> eol_p
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
nospace
|
||||||
|
= +space >> str_p("$+") >> +space
|
||||||
|
;
|
||||||
identifier
|
identifier
|
||||||
= alpha_p >> *alnum_p
|
= alpha_p >> *alnum_p
|
||||||
;
|
;
|
||||||
string
|
string
|
||||||
= ( variable[e_append][v_fetch]
|
= (+(graph_p - ch_p(',') - ch_p('(') - ch_p(')')))
|
||||||
| alias_function[e_append]
|
;
|
||||||
| (+(graph_p - ch_p(',') - ch_p('(') - ch_p(')')))[e_append]
|
value
|
||||||
|
= ( variable[v_append][v_fetch]
|
||||||
|
| alias_function[v_append]
|
||||||
|
| string[v_append]
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
expression
|
expression
|
||||||
= string >> *(*space >> string)
|
= (*nospace >> value)[e_append]
|
||||||
|
>> *(+space >> (+(*nospace >> value))[e_append])
|
||||||
;
|
;
|
||||||
expression_group
|
expression_group
|
||||||
= expression | expression_group
|
= expression | expression_group
|
||||||
|
|
|
@ -70,6 +70,13 @@ void mirc_script_engine::assign_variable(char const* str, char const* end) {
|
||||||
void mirc_script_engine::fetch_variable(char const*, char const*) {
|
void mirc_script_engine::fetch_variable(char const*, char const*) {
|
||||||
if (stage != EXECUTE) return;
|
if (stage != EXECUTE) return;
|
||||||
|
|
||||||
|
if (!current_value.isEmpty()) {
|
||||||
|
QString var = current_value.last();
|
||||||
|
current_value.removeLast();
|
||||||
|
var = (manager->hasVariable(var) ? manager->variable(var) : vars[var]);
|
||||||
|
current_value << var;
|
||||||
|
}
|
||||||
|
/*
|
||||||
if (!stack.isEmpty()) {
|
if (!stack.isEmpty()) {
|
||||||
QStringList values = stack.pop();
|
QStringList values = stack.pop();
|
||||||
if (!values.isEmpty()) {
|
if (!values.isEmpty()) {
|
||||||
|
@ -79,19 +86,24 @@ void mirc_script_engine::fetch_variable(char const*, char const*) {
|
||||||
}
|
}
|
||||||
stack.push(values);
|
stack.push(values);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
void mirc_script_engine::append_value(char const* str, char const *end) {
|
||||||
|
if (stage != EXECUTE) return;
|
||||||
|
|
||||||
|
string s(str, end);
|
||||||
|
current_value << s.c_str();
|
||||||
}
|
}
|
||||||
void mirc_script_engine::append_expression(char const* str, char const *end) {
|
void mirc_script_engine::append_expression(char const* str, char const *end) {
|
||||||
if (stage != EXECUTE) return;
|
if (stage != EXECUTE) return;
|
||||||
|
|
||||||
string s(str, end);
|
string s(str, end);
|
||||||
QStringList list;
|
QStringList list;
|
||||||
if (stack.isEmpty()) {
|
if (!stack.isEmpty()) list = stack.pop();
|
||||||
list << s.c_str();
|
//list << s.c_str();
|
||||||
} else {
|
list << current_value.join("");
|
||||||
list = stack.pop();
|
|
||||||
list << s.c_str();
|
|
||||||
}
|
|
||||||
stack.push(list);
|
stack.push(list);
|
||||||
|
current_value.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void mirc_script_engine::clear_stack(char const*, char const*) {
|
void mirc_script_engine::clear_stack(char const*, char const*) {
|
||||||
|
|
|
@ -3,7 +3,8 @@ set name Correl
|
||||||
%first = Correl
|
%first = Correl
|
||||||
%middle = Joseph
|
%middle = Joseph
|
||||||
%name = %first $&
|
%name = %first $&
|
||||||
%middle Roush
|
%middle $+ Roush $&
|
||||||
|
$+ ... how are you?
|
||||||
echo Hello, %name!
|
echo Hello, %name!
|
||||||
alias dostuff {
|
alias dostuff {
|
||||||
; Not very useful, but good for testing the parser!
|
; Not very useful, but good for testing the parser!
|
||||||
|
|
Loading…
Reference in a new issue