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:
Correl Roush 2009-04-22 14:46:41 +00:00
parent 34b445fe87
commit c720c5aa5e
4 changed files with 44 additions and 13 deletions

View file

@ -210,7 +210,12 @@ bool MessageHandler::call_alias(QString alias, QStringList args) {
} else if( alias == "quit" || alias == "q" ) {
if( args.count() > 0 ) { irc->quit( args.join( " " ) ); }
else { irc->quit(); }
} else if(alias == "echo") {
windows["status"]->echo(args.join(" "));
} 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 true;

View file

@ -41,7 +41,8 @@ typedef QMap<QString, mirc_alias> mirc_aliases;
enum mirc_engine_stage {
PARSE,
EXECUTE
EXECUTE,
TERMINATED
};
class mirc_script_engine : public QObject {
@ -50,6 +51,7 @@ private:
MIRCScriptManager *manager;
mirc_aliases::iterator current_alias;
mirc_variables::iterator current_variable;
QStringList current_value;
QStack<QStringList> stack;
public:
@ -69,6 +71,7 @@ public:
void declare_variable(char const* str, char const* end);
void assign_variable(char const* str, char const* end);
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 clear_stack(char const*, char const*);
};
@ -84,8 +87,10 @@ struct mirc_script : public grammar<mirc_script> {
struct definition {
rule<ScannerT> script,
space,
nospace,
identifier,
string,
value,
expression,
expression_group,
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_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_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 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 ) );
@ -124,17 +130,24 @@ struct mirc_script : public grammar<mirc_script> {
| str_p("$&") >> *blank_p >> eol_p
)
;
nospace
= +space >> str_p("$+") >> +space
;
identifier
= alpha_p >> *alnum_p
;
string
= ( variable[e_append][v_fetch]
| alias_function[e_append]
| (+(graph_p - ch_p(',') - ch_p('(') - ch_p(')')))[e_append]
= (+(graph_p - ch_p(',') - ch_p('(') - ch_p(')')))
;
value
= ( variable[v_append][v_fetch]
| alias_function[v_append]
| string[v_append]
)
;
expression
= string >> *(*space >> string)
= (*nospace >> value)[e_append]
>> *(+space >> (+(*nospace >> value))[e_append])
;
expression_group
= expression | expression_group

View file

@ -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*) {
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()) {
QStringList values = stack.pop();
if (!values.isEmpty()) {
@ -79,19 +86,24 @@ void mirc_script_engine::fetch_variable(char const*, char const*) {
}
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) {
if (stage != EXECUTE) return;
string s(str, end);
QStringList list;
if (stack.isEmpty()) {
list << s.c_str();
} else {
list = stack.pop();
list << s.c_str();
}
if (!stack.isEmpty()) list = stack.pop();
//list << s.c_str();
list << current_value.join("");
stack.push(list);
current_value.clear();
}
void mirc_script_engine::clear_stack(char const*, char const*) {

View file

@ -3,7 +3,8 @@ set name Correl
%first = Correl
%middle = Joseph
%name = %first $&
%middle Roush
%middle $+ Roush $&
$+ ... how are you?
echo Hello, %name!
alias dostuff {
; Not very useful, but good for testing the parser!