mirror of
https://github.com/amyinspace/MagicSetEditor2.git
synced 2026-06-10 04:57:00 -04:00
Added support for scripts to determine word lists;
Added 'trim' and 'remove_tags' script functions; Simplified safety improvements of locale checker; Added 'is_targeted' function to magic game to replace the contains(..) calls git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@635 0fc631ac-6414-0410-93d0-97cfa31319b6
This commit is contained in:
@@ -54,6 +54,12 @@ SCRIPT_FUNCTION(reverse) {
|
||||
SCRIPT_RETURN(input);
|
||||
}
|
||||
|
||||
// remove leading and trailing whitespace from a string
|
||||
SCRIPT_FUNCTION(trim) {
|
||||
SCRIPT_PARAM(String, input);
|
||||
SCRIPT_RETURN(trim(input));
|
||||
}
|
||||
|
||||
// extract a substring
|
||||
SCRIPT_FUNCTION(substring) {
|
||||
SCRIPT_PARAM(String, input);
|
||||
@@ -156,6 +162,11 @@ SCRIPT_RULE_1(tag_remove, String, tag) {
|
||||
SCRIPT_RETURN(remove_tag(input, tag));
|
||||
}
|
||||
|
||||
SCRIPT_FUNCTION(remove_tags) {
|
||||
SCRIPT_PARAM(String, input);
|
||||
SCRIPT_RETURN(untag_no_escape(input));
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------- : Collection stuff
|
||||
|
||||
/// compare script values for equallity
|
||||
@@ -593,6 +604,7 @@ void init_script_basic_functions(Context& ctx) {
|
||||
ctx.setVariable(_("to lower"), script_to_lower);
|
||||
ctx.setVariable(_("to title"), script_to_title);
|
||||
ctx.setVariable(_("reverse"), script_reverse);
|
||||
ctx.setVariable(_("trim"), script_trim);
|
||||
ctx.setVariable(_("substring"), script_substring);
|
||||
ctx.setVariable(_("contains"), script_contains);
|
||||
ctx.setVariable(_("format"), script_format);
|
||||
@@ -602,6 +614,7 @@ void init_script_basic_functions(Context& ctx) {
|
||||
// tagged string
|
||||
ctx.setVariable(_("tag contents"), script_tag_contents);
|
||||
ctx.setVariable(_("remove tag"), script_tag_remove);
|
||||
ctx.setVariable(_("remove tags"), script_remove_tags);
|
||||
ctx.setVariable(_("tag contents rule"), script_tag_contents_rule);
|
||||
ctx.setVariable(_("tag remove rule"), script_tag_remove_rule);
|
||||
// collection
|
||||
|
||||
+26
-15
@@ -327,22 +327,22 @@ enum Precedence
|
||||
};
|
||||
|
||||
/// Parse an expression
|
||||
/** @param input Read tokens from the input
|
||||
* @param scrip Add resulting instructions to the script
|
||||
* @param minPrec Minimum precedence level for operators
|
||||
/** @param input Read tokens from the input
|
||||
* @param scrip Add resulting instructions to the script
|
||||
* @param min_prec Minimum precedence level for operators
|
||||
* NOTE: The net stack effect of an expression should be +1
|
||||
*/
|
||||
void parseExpr(TokenIterator& input, Script& script, Precedence minPrec);
|
||||
void parseExpr(TokenIterator& input, Script& script, Precedence min_prec);
|
||||
|
||||
/// Parse an expression, possibly with operators applied. Optionally adds an instruction at the end.
|
||||
/** @param input Read tokens from the input
|
||||
* @param script Add resulting instructions to the script
|
||||
* @param minPrec Minimum precedence level for operators
|
||||
* @param closeWith Add this instruction at the end
|
||||
* @param closeWithData Data for the instruction at the end
|
||||
/** @param input Read tokens from the input
|
||||
* @param script Add resulting instructions to the script
|
||||
* @param min_prec Minimum precedence level for operators
|
||||
* @param close_with Add this instruction at the end
|
||||
* @param close_with_data Data for the instruction at the end
|
||||
* NOTE: The net stack effect of an expression should be +1
|
||||
*/
|
||||
void parseOper(TokenIterator& input, Script& script, Precedence minPrec, InstructionType closeWith = I_NOP, int closeWithData = 0);
|
||||
void parseOper(TokenIterator& input, Script& script, Precedence min_prec, InstructionType close_with = I_NOP, int close_with_data = 0);
|
||||
|
||||
|
||||
ScriptP parse(const String& s, bool string_mode, vector<ScriptParseError>& errors_out) {
|
||||
@@ -542,7 +542,9 @@ void parseExpr(TokenIterator& input, Script& script, Precedence minPrec) {
|
||||
}
|
||||
|
||||
void parseOper(TokenIterator& input, Script& script, Precedence minPrec, InstructionType closeWith, int closeWithData) {
|
||||
size_t added = script.getInstructions().size(); // number of instructions added
|
||||
parseExpr(input, script, minPrec); // first argument
|
||||
added -= script.getInstructions().size();
|
||||
// read any operators after an expression
|
||||
// EBNF: expr = expr | expr oper expr
|
||||
// without left recursion: expr = expr (oper expr)*
|
||||
@@ -565,10 +567,8 @@ void parseOper(TokenIterator& input, Script& script, Precedence minPrec, Instruc
|
||||
} else if (minPrec <= PREC_SET && token==_(":=")) {
|
||||
// We made a mistake, the part before the := should be a variable name,
|
||||
// not an expression. Remove that instruction.
|
||||
// TODO: There is a bug here:
|
||||
// (if x then a else b) := c will use the 'b' as variable name
|
||||
Instruction instr = script.getInstructions().back();
|
||||
if (instr.instr != I_GET_VAR) {
|
||||
Instruction& instr = script.getInstructions().back();
|
||||
if (added == 1 && instr.instr != I_GET_VAR) {
|
||||
input.add_error(_("Can only assign to variables"));
|
||||
}
|
||||
script.getInstructions().pop_back();
|
||||
@@ -610,7 +610,18 @@ void parseOper(TokenIterator& input, Script& script, Precedence minPrec, Instruc
|
||||
input.expected(_("name"));
|
||||
}
|
||||
} else if (minPrec <= PREC_FUN && token==_("[")) { // get member by expr
|
||||
parseOper(input, script, PREC_ALL, I_BINARY, I_MEMBER);
|
||||
size_t before = script.getInstructions().size();
|
||||
parseOper(input, script, PREC_ALL);
|
||||
if (script.getInstructions().size() == before + 1 && script.getInstructions().back().instr == I_PUSH_CONST) {
|
||||
// optimize:
|
||||
// PUSH_CONST x
|
||||
// MEMBER
|
||||
// becomes
|
||||
// MEMBER_CONST x
|
||||
script.getInstructions().back().instr = I_MEMBER_C;
|
||||
} else {
|
||||
script.addInstruction(I_BINARY, I_MEMBER);
|
||||
}
|
||||
expectToken(input, _("]"));
|
||||
} else if (minPrec <= PREC_FUN && token==_("(")) {
|
||||
// function call, read arguments
|
||||
|
||||
Reference in New Issue
Block a user