1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-06-20 09:41:33 +00:00

backend for tab completion: keywords

This commit is contained in:
Marc Zinnschlag 2011-01-12 18:24:00 +01:00
parent 940554b5fc
commit 6848115c18
6 changed files with 80 additions and 31 deletions

View file

@ -1,6 +1,8 @@
#include "console.hpp" #include "console.hpp"
#include <algorithm>
#include <components/compiler/exception.hpp> #include <components/compiler/exception.hpp>
#include "../mwscript/extensions.hpp" #include "../mwscript/extensions.hpp"
@ -26,6 +28,12 @@ namespace MWGui
bool Console::compile (const std::string& cmd, Compiler::Output& output) bool Console::compile (const std::string& cmd, Compiler::Output& output)
{ {
listNames();
for (std::vector<std::string>::iterator iter (mNames.begin()); iter!=mNames.end(); ++iter)
std::cout << *iter << ", ";
std::cout << std::endl;
try try
{ {
ErrorHandler::reset(); ErrorHandler::reset();
@ -67,6 +75,20 @@ namespace MWGui
printError ((type==ErrorMessage ? "error: " : "warning: ") + message); printError ((type==ErrorMessage ? "error: " : "warning: ") + message);
} }
void Console::listNames()
{
if (mNames.empty())
{
std::istringstream input ("");
Compiler::Scanner scanner (*this, input, mCompilerContext.getExtensions());
scanner.listKeywords (mNames);
std::sort (mNames.begin(), mNames.end());
}
}
Console::Console(int w, int h, MWWorld::Environment& environment, Console::Console(int w, int h, MWWorld::Environment& environment,
const Compiler::Extensions& extensions) const Compiler::Extensions& extensions)
: Layout("openmw_console_layout.xml"), : Layout("openmw_console_layout.xml"),

View file

@ -21,10 +21,11 @@ namespace MWGui
class Console : private OEngine::GUI::Layout, private Compiler::ErrorHandler class Console : private OEngine::GUI::Layout, private Compiler::ErrorHandler
{ {
private: private:
MWScript::CompilerContext mCompilerContext; MWScript::CompilerContext mCompilerContext;
MWWorld::Environment& mEnvironment; MWWorld::Environment& mEnvironment;
std::vector<std::string> mNames;
bool compile (const std::string& cmd, Compiler::Output& output); bool compile (const std::string& cmd, Compiler::Output& output);
/// Report error to the user. /// Report error to the user.
@ -32,7 +33,11 @@ namespace MWGui
/// Report a file related error /// Report a file related error
virtual void report (const std::string& message, Type type); virtual void report (const std::string& message, Type type);
void listNames();
///< Write all valid identifiers and keywords into mNames and sort them.
/// \note If mNames is not empty, this function is a no-op.
public: public:
MyGUI::EditPtr command; MyGUI::EditPtr command;
MyGUI::EditPtr history; MyGUI::EditPtr history;

View file

@ -207,4 +207,11 @@ namespace Compiler
throw std::logic_error ("unsupported code segment"); throw std::logic_error ("unsupported code segment");
} }
} }
void Extensions::listKeywords (std::vector<std::string>& keywords) const
{
for (std::map<std::string, int>::const_iterator iter (mKeywords.begin());
iter!=mKeywords.end(); ++iter)
keywords.push_back (iter->first);
}
} }

View file

@ -78,6 +78,9 @@ namespace Compiler
void generateInstructionCode (int keyword, std::vector<Interpreter::Type_Code>& code, void generateInstructionCode (int keyword, std::vector<Interpreter::Type_Code>& code,
Literals& literals, const std::string& id, int optionalArguments) const; Literals& literals, const std::string& id, int optionalArguments) const;
///< Append code for function to \a code. ///< Append code for function to \a code.
void listKeywords (std::vector<std::string>& keywords) const;
///< Append all known keywords to \æ kaywords.
}; };
} }

View file

@ -230,27 +230,27 @@ namespace Compiler
return true; return true;
} }
static const char *keywords[] =
{
"begin", "end",
"short", "long", "float",
"if", "endif", "else", "elseif",
"while", "endwhile",
"return",
"messagebox",
"set", "to",
"getsquareroot",
"menumode",
"random",
"startscript", "stopscript", "scriptrunning",
"getdistance",
"getsecondspassed",
"enable", "disable", "getdisabled",
0
};
bool Scanner::scanName (char c, Parser& parser, bool& cont) bool Scanner::scanName (char c, Parser& parser, bool& cont)
{ {
static const char *keywords[] =
{
"begin", "end",
"short", "long", "float",
"if", "endif", "else", "elseif",
"while", "endwhile",
"return",
"messagebox",
"set", "to",
"getsquareroot",
"menumode",
"random",
"startscript", "stopscript", "scriptrunning",
"getdistance",
"getsecondspassed",
"enable", "disable", "getdisabled",
0
};
std::string name; std::string name;
if (!scanName (c, name)) if (!scanName (c, name))
@ -513,4 +513,13 @@ namespace Compiler
mPutbackCode = keyword; mPutbackCode = keyword;
mPutbackLoc = loc; mPutbackLoc = loc;
} }
void Scanner::listKeywords (std::vector<std::string>& keywords)
{
for (int i=0; Compiler::keywords[i]; ++i)
keywords.push_back (Compiler::keywords[i]);
if (mExtensions)
mExtensions->listKeywords (keywords);
}
} }

View file

@ -3,6 +3,7 @@
#include <string> #include <string>
#include <iosfwd> #include <iosfwd>
#include <vector>
#include "tokenloc.hpp" #include "tokenloc.hpp"
@ -24,7 +25,7 @@ namespace Compiler
Putback_None, Putback_Special, Putback_Integer, Putback_Float, Putback_None, Putback_Special, Putback_Integer, Putback_Float,
Putback_Name, Putback_Keyword Putback_Name, Putback_Keyword
}; };
ErrorHandler& mErrorHandler; ErrorHandler& mErrorHandler;
TokenLoc mLoc; TokenLoc mLoc;
TokenLoc mPrevLoc; TokenLoc mPrevLoc;
@ -101,21 +102,23 @@ namespace Compiler
void scan (Parser& parser); void scan (Parser& parser);
///< Scan a token and deliver it to the parser. ///< Scan a token and deliver it to the parser.
void putbackSpecial (int code, const TokenLoc& loc); void putbackSpecial (int code, const TokenLoc& loc);
///< put back a special token ///< put back a special token
void putbackInt (int value, const TokenLoc& loc); void putbackInt (int value, const TokenLoc& loc);
///< put back an integer token ///< put back an integer token
void putbackFloat (float value, const TokenLoc& loc); void putbackFloat (float value, const TokenLoc& loc);
///< put back a float token ///< put back a float token
void putbackName (const std::string& name, const TokenLoc& loc); void putbackName (const std::string& name, const TokenLoc& loc);
///< put back a name toekn ///< put back a name toekn
void putbackKeyword (int keyword, const TokenLoc& loc); void putbackKeyword (int keyword, const TokenLoc& loc);
///< put back a keyword token ///< put back a keyword token
void listKeywords (std::vector<std::string>& keywords);
///< Append all known keywords to \æ kaywords.
}; };
} }