00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00027 #include "ShTokenizer.hpp"
00028 #include "ShError.hpp"
00029
00030 namespace SH {
00031
00032 ShTokenizerException::ShTokenizerException(const std::string& error)
00033 : ShException("Tokenizer error: " + error)
00034 {
00035 }
00036
00037 ShTokenizer::ShTokenizer()
00038 {
00039 m_listStack.push(new ShBlockList());
00040 }
00041
00042 bool ShTokenizer::pushArgQueue()
00043 {
00044 m_argQueueStack.push(std::queue<ShTokenArgument>());
00045 return true;
00046 }
00047
00048 bool ShTokenizer::pushArg()
00049 {
00050 m_listStack.push(new ShBlockList(true));
00051 return true;
00052 }
00053
00054 bool ShTokenizer::processArg(const ShVariable& result)
00055 {
00056
00057 if (!m_listStack.top()->isArgument()) {
00058 shError( ShTokenizerException("Attempt to process an argument outside of an argument context.") );
00059 }
00060
00061 if (m_argQueueStack.empty()) {
00062 shError( ShTokenizerException("Attempt to process an argument without a context.") );
00063 }
00064
00065 m_argQueueStack.top().push(ShTokenArgument(result, m_listStack.top()));
00066 m_listStack.pop();
00067 return true;
00068 }
00069
00070 ShBlockListPtr ShTokenizer::blockList()
00071 {
00072 if (m_listStack.empty()) {
00073 shError( ShTokenizerException("No current tokenized list.") );
00074 }
00075 return m_listStack.top();
00076 }
00077
00078 ShTokenArgument ShTokenizer::getArgument()
00079 {
00080 if (m_argQueueStack.empty()) {
00081 shError( ShTokenizerException("getArgument(): Argument stack underflow") );
00082 }
00083 if (m_argQueueStack.top().empty()) {
00084 shError( ShTokenizerException("getArgument(): Argument is empty") );
00085 }
00086 ShTokenArgument r = m_argQueueStack.top().front();
00087 m_argQueueStack.top().pop();
00088 return r;
00089 }
00090
00091 void ShTokenizer::popArgQueue()
00092 {
00093 if (m_argQueueStack.empty()) {
00094 shError( ShTokenizerException("popArgQueue(): Argument stack underflow") );
00095 }
00096 m_argQueueStack.pop();
00097 }
00098
00099 }
00100
00101
00102