parser.hh
Go to the documentation of this file.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
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef __FLATZINC_PARSER_HH__
00039 #define __FLATZINC_PARSER_HH__
00040
00041 #include <gecode/flatzinc.hh>
00042
00043
00044
00045 #if defined(_MSC_VER)
00046 #define YY_NO_UNISTD_H
00047 #ifdef __cplusplus
00048 extern "C" int isatty(int);
00049 #endif
00050 #endif
00051
00052
00053
00054 #if defined(_MSC_VER)
00055 #define strdup _strdup
00056 #define fileno _fileno
00057 #endif
00058
00059 #include <string>
00060 #include <vector>
00061 #include <iostream>
00062
00063 #include <gecode/flatzinc/option.hh>
00064 #include <gecode/flatzinc/varspec.hh>
00065 #include <gecode/flatzinc/conexpr.hh>
00066 #include <gecode/flatzinc/ast.hh>
00067 #include <gecode/flatzinc/parser.tab.hh>
00068 #include <gecode/flatzinc/symboltable.hh>
00069
00070 namespace Gecode { namespace FlatZinc {
00071
00072 typedef std::pair<std::string,Option<std::vector<int>* > > intvartype;
00073
00074 class VarSpec;
00075 typedef std::pair<std::string, VarSpec*> varspec;
00076
00078 class ParserState {
00079 public:
00080 ParserState(const std::string& b, std::ostream& err0)
00081 : buf(b.c_str()), pos(0), length(b.size()), fg(NULL),
00082 hadError(false), err(err0) {}
00083
00084 ParserState(char* buf0, int length0, std::ostream& err0)
00085 : buf(buf0), pos(0), length(length0), fg(NULL),
00086 hadError(false), err(err0) {}
00087
00088 void* yyscanner;
00089 const char* buf;
00090 unsigned int pos, length;
00091 Gecode::FlatZinc::FlatZincSpace* fg;
00092 std::vector<std::pair<std::string,AST::Node*> > _output;
00093
00094 SymbolTable<int> intvarTable;
00095 SymbolTable<int> boolvarTable;
00096 SymbolTable<int> floatvarTable;
00097 SymbolTable<int> setvarTable;
00098 SymbolTable<std::vector<int> > intvararrays;
00099 SymbolTable<std::vector<int> > boolvararrays;
00100 SymbolTable<std::vector<int> > floatvararrays;
00101 SymbolTable<std::vector<int> > setvararrays;
00102 SymbolTable<std::vector<int> > intvalarrays;
00103 SymbolTable<std::vector<int> > boolvalarrays;
00104 SymbolTable<int> intvals;
00105 SymbolTable<bool> boolvals;
00106 SymbolTable<AST::SetLit> setvals;
00107 SymbolTable<std::vector<AST::SetLit> > setvalarrays;
00108
00109 std::vector<varspec> intvars;
00110 std::vector<varspec> boolvars;
00111 std::vector<varspec> setvars;
00112
00113 std::vector<ConExpr*> domainConstraints;
00114
00115 bool hadError;
00116 std::ostream& err;
00117
00118 int fillBuffer(char* lexBuf, unsigned int lexBufSize) {
00119 if (pos >= length)
00120 return 0;
00121 int num = std::min(length - pos, lexBufSize);
00122 memcpy(lexBuf,buf+pos,num);
00123 pos += num;
00124 return num;
00125 }
00126
00127 void output(std::string x, AST::Node* n) {
00128 _output.push_back(std::pair<std::string,AST::Node*>(x,n));
00129 }
00130
00131 AST::Array* getOutput(void) {
00132 AST::Array* a = new AST::Array();
00133 for (unsigned int i=0; i<_output.size(); i++) {
00134 a->a.push_back(new AST::String(_output[i].first+" = "));
00135 if (_output[i].second->isArray()) {
00136 AST::Array* oa = _output[i].second->getArray();
00137 for (unsigned int j=0; j<oa->a.size(); j++) {
00138 a->a.push_back(oa->a[j]);
00139 oa->a[j] = NULL;
00140 }
00141 delete _output[i].second;
00142 } else {
00143 a->a.push_back(_output[i].second);
00144 }
00145 a->a.push_back(new AST::String(";\n"));
00146 }
00147 return a;
00148 }
00149
00150 };
00151
00152 }}
00153
00154 #endif
00155
00156