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