diff --git a/Geo/Cell.cpp b/Geo/Cell.cpp
index 0b31ca2f58d77eb238763eb6a206dadc1040d941..322071f57f0fe5dfb2210ad64a13e4fb9229260e 100644
--- a/Geo/Cell.cpp
+++ b/Geo/Cell.cpp
@@ -39,6 +39,34 @@ bool equalVertices(const std::vector<MVertex*>& v1,
 
 int Cell::_globalNum = 0;
 
+std::pair<Cell*, bool> Cell::createCell(MElement* element, int domain)
+{
+  Cell* cell = new Cell();
+  cell->_dim = element->getDim();
+  cell->_domain = domain;
+  cell->_combined = false;
+  cell->_immune = false;
+  cell->_num = 0;
+
+  for(int i = 0; i < element->getNumPrimaryVertices(); i++)
+    cell->_v.push_back(element->getVertex(i));
+
+  return std::make_pair(cell, cell->_sortVertexIndices());
+}
+
+std::pair<Cell*, bool> Cell::createCell(Cell* parent, int i)
+{
+  Cell* cell = new Cell();
+  cell->_dim = parent->getDim()-1;
+  cell->_domain = parent->getDomain();
+  cell->_combined = false;
+  cell->_immune = false;
+  cell->_num = 0;
+
+  parent->findBdElement(i, cell->_v);
+  return std::make_pair(cell, cell->_sortVertexIndices());
+}
+
 Cell::Cell(MElement* element, int domain)
 {
   _dim = element->getDim();
@@ -65,16 +93,24 @@ Cell::Cell(Cell* parent, int i)
   _sortVertexIndices();
 }
 
-void Cell::_sortVertexIndices()
+bool Cell::_sortVertexIndices()
 {
   std::map<MVertex*, int, MVertexLessThanNum> si;
 
+  bool noinsert = false;
   for(unsigned int i = 0; i < _v.size(); i++)
-    si[_v[i]] = i;
+    noinsert = (!si.insert(std::make_pair(_v[i], i)).second || noinsert);
+
+  if(noinsert == true) {
+    Msg::Warning("The input mesh has degenerate elements, ignored");
+    return false;
+  }
 
   std::map<MVertex*, int, MVertexLessThanNum>::iterator it;
   for(it = si.begin(); it != si.end(); it++)
     _si.push_back(it->second);
+
+  return true;
 }
 
 inline int Cell::getSortedVertex(int vertex) const
@@ -436,30 +472,30 @@ bool Cell::hasCoboundary(Cell* cell, bool orig)
     return false;
   }
 }
-/*
-void Cell::printBoundary(bool orig)
+
+void Cell::printBoundary()
 {
-  for(biter it = firstBoundary(orig); it != lastBoundary(orig); it++){
-    printf("Boundary cell orientation: %d ", (*it).second);
-    Cell* cell2 = (*it).first;
+  for(biter it = firstBoundary(); it != lastBoundary(); it++){
+    printf("Boundary cell orientation: %d ", it->second.get());
+    Cell* cell2 = it->first;
     cell2->printCell();
   }
-  if(firstBoundary(orig) == lastBoundary(orig)){
+  if(firstBoundary() == lastBoundary()){
     printf("Cell boundary is empty. \n");
   }
 }
 
-void Cell::printCoboundary(bool orig)
+void Cell::printCoboundary()
 {
-  for(biter it = firstCoboundary(orig); it != lastCoboundary(orig); it++){
-    printf("Coboundary cell orientation: %d, ", (*it).second);
-    Cell* cell2 = (*it).first;
+  for(biter it = firstCoboundary(); it != lastCoboundary(); it++){
+    printf("Coboundary cell orientation: %d, ", it->second.get());
+    Cell* cell2 = it->first;
     cell2->printCell();
-    if(firstCoboundary(orig) == lastCoboundary(orig)){
+    if(firstCoboundary() == lastCoboundary()){
       printf("Cell coboundary is empty. \n");
     }
   }
-  }*/
+}
 
 CombinedCell::CombinedCell(Cell* c1, Cell* c2, bool orMatch, bool co)
 {
diff --git a/Geo/Cell.h b/Geo/Cell.h
index a1db14df78bd7c82c8fd0aa26b0409fa8a0f6a60..a9b351287915372a01ddd3167d82e0f76f2f6039 100644
--- a/Geo/Cell.h
+++ b/Geo/Cell.h
@@ -56,6 +56,8 @@ class Cell {
   std::map<Cell*, BdInfo, Less_Cell> _bd;
   std::map<Cell*, BdInfo, Less_Cell> _cbd;
 
+  Cell() {}
+
  private:
 
   char _dim;
@@ -63,11 +65,13 @@ class Cell {
   // sorted vertices of this cell (used for ordering of the cells)
   std::vector<char> _si;
 
-  inline void _sortVertexIndices();
+  inline bool _sortVertexIndices();
 
  public:
 
-  Cell() {}
+  static std::pair<Cell*, bool> createCell(MElement* element, int domain);
+  static std::pair<Cell*, bool> createCell(Cell* parent, int i);
+
   Cell(MElement* element, int domain);
   Cell(Cell* parent, int i);
 
@@ -85,7 +89,7 @@ class Cell {
   void setImmune(bool immune) { _immune = immune; };
   bool getImmune() const { return _immune; };
 
-  int getNumSortedVertices() const { return _v.size(); }
+  int getNumSortedVertices() const { return _si.size(); }
   inline int getSortedVertex(int vertex) const;
   int getNumVertices() const { return _v.size(); }
   MVertex* getMeshVertex(int vertex) const { return _v.at(vertex); }
@@ -182,8 +186,8 @@ class Cell {
 
   // print cell debug info
   virtual void printCell();
-  //virtual void printBoundary(bool orig=false);
-  //virtual void printCoboundary(bool orig=false);
+  virtual void printBoundary();
+  virtual void printCoboundary();
 
   // tools for combined cells
   bool isCombined() const { return _combined; }
diff --git a/Geo/CellComplex.cpp b/Geo/CellComplex.cpp
index a728813f8cf0b9d3ccb5075232e6317e5f266e3b..fe38baf4dd3af61a225b26ba5b112bb16eddfe44 100644
--- a/Geo/CellComplex.cpp
+++ b/Geo/CellComplex.cpp
@@ -15,11 +15,15 @@ CellComplex::CellComplex(GModel* model,
                          std::vector<MElement*>& nonsubdomainElements,
                          std::vector<MElement*>& immuneElements,
                          bool saveOriginalComplex) :
-  _model(model), _dim(0), _simplicial(true), _saveorig(saveOriginalComplex)
+  _model(model), _dim(0), _simplicial(true), _saveorig(saveOriginalComplex),
+  _relative(false)
 {
   _deleteCount = 0;
   _insertCells(subdomainElements, 1);
+  if(getSize(0) > 0) _relative = true;
+
   _insertCells(domainElements, 0);
+
   _removeCells(nonsubdomainElements, 1);
   _removeCells(nondomainElements, 0);
   _immunizeCells(immuneElements);
@@ -50,7 +54,12 @@ bool CellComplex::_insertCells(std::vector<MElement*>& elements,
     }
     if(type == TYPE_QUA || type == TYPE_HEX)
       _simplicial = false;
-    Cell* cell = new Cell(element, domain);
+    std::pair<Cell*, bool> maybeCell = Cell::createCell(element, domain);
+    if(!maybeCell.second) {
+      delete maybeCell.first;
+      continue;
+    }
+    Cell* cell = maybeCell.first;
     std::pair<citer, bool> insert =
       _cells[cell->getDim()].insert(cell);
     if(!insert.second) {
@@ -64,7 +73,12 @@ bool CellComplex::_insertCells(std::vector<MElement*>& elements,
     for(citer cit = firstCell(dim); cit != lastCell(dim); cit++){
       Cell* cell = *cit;
       for(int i = 0; i < cell->getNumBdElements(); i++){
-	Cell* newCell = new Cell(cell, i);
+        std::pair<Cell*, bool> maybeCell = Cell::createCell(cell, i);
+        if(!maybeCell.second) {
+          delete maybeCell.first;
+          continue;
+        }
+        Cell* newCell = maybeCell.first;
 	std::pair<citer, bool> insert =
 	  _cells[newCell->getDim()].insert(newCell);
 	if(!insert.second) {
@@ -337,7 +351,7 @@ int CellComplex::coreduction(int dim, bool omit,
   return count;
 }
 
-int CellComplex::reduceComplex(bool docombine, bool omit)
+int CellComplex::reduceComplex(int combine, bool omit)
 {
   Msg::Debug("Cell Complex reduction:");
   Msg::Debug(" %d volumes, %d faces, %d edges, and %d vertices",
@@ -345,12 +359,12 @@ int CellComplex::reduceComplex(bool docombine, bool omit)
 
   if(!getSize(0)) return 0;
   int count = 0;
+  if(relative()) removeSubdomain();
   std::vector<Cell*> empty;
   for(int i = 3; i > 0; i--) count = count + reduction(i, false, empty);
 
   if(omit){
 
-    removeSubdomain();
     std::vector<Cell*> newCells;
 
     while (getSize(getDim()) != 0){
@@ -374,11 +388,11 @@ int CellComplex::reduceComplex(bool docombine, bool omit)
   Msg::Debug(" %d volumes, %d faces, %d edges, and %d vertices",
              getSize(3), getSize(2), getSize(1), getSize(0));
 
-  if(docombine) combine(3);
+  if(combine > 0) this->combine(3);
   reduction(2, false, empty);
-  if(docombine) combine(2);
+  if(combine > 0) this->combine(2);
   reduction(1, false, empty);
-  if(docombine) combine(1);
+  if(combine > 0) this->combine(1);
 
   Msg::Debug(" %d volumes, %d faces, %d edges, and %d vertices",
   getSize(3), getSize(2), getSize(1), getSize(0));
@@ -400,7 +414,18 @@ void CellComplex::removeSubdomain()
   _reduced = true;
 }
 
-int CellComplex::coreduceComplex(bool docombine, bool omit)
+void CellComplex::removeCells(int dim)
+{
+  if(dim < 0 || dim > 3) return;
+  std::vector<Cell*> toRemove;
+  for(citer cit = firstCell(dim); cit != lastCell(dim); ++cit){
+    toRemove.push_back(*cit);
+  }
+  for(unsigned int i = 0; i < toRemove.size(); i++) removeCell(toRemove[i]);
+  _reduced = true;
+}
+
+int CellComplex::coreduceComplex(int combine, bool omit)
 {
   Msg::Debug("Cell Complex coreduction:");
   Msg::Debug(" %d volumes, %d faces, %d edges, and %d vertices",
@@ -408,7 +433,7 @@ int CellComplex::coreduceComplex(bool docombine, bool omit)
 
   if(!getSize(0)) return 0;
   int count = 0;
-  removeSubdomain();
+  if(relative()) removeSubdomain();
   std::vector<Cell*> empty;
   for(int dim = 0; dim < 4; dim++){
     citer cit = firstCell(dim);
@@ -444,12 +469,13 @@ int CellComplex::coreduceComplex(bool docombine, bool omit)
   Msg::Debug(" %d volumes, %d faces, %d edges, and %d vertices",
              getSize(3), getSize(2), getSize(1), getSize(0));
 
-  if(docombine) cocombine(0);
+  if(combine > 0) this->cocombine(0);
   coreduction(1, false, empty);
-  if(docombine) cocombine(1);
+  if(combine > 0) this->cocombine(1);
   coreduction(2, false, empty);
-  if(docombine) cocombine(2);
+  if(combine > 0) this->cocombine(2);
   coreduction(3, false, empty);
+
   coherent();
   Msg::Debug(" %d volumes, %d faces, %d edges, and %d vertices",
              getSize(3), getSize(2), getSize(1), getSize(0));
@@ -686,9 +712,9 @@ void CellComplex::printComplex(int dim)
   for (citer cit = firstCell(dim); cit != lastCell(dim); cit++){
     Cell* cell = *cit;
     cell->printCell();
-    //cell->printBoundary();
-    //cell->printCoboundary();
-    //printf("--- \n");
+    cell->printBoundary();
+    cell->printCoboundary();
+    printf("--- \n");
   }
 }
 
diff --git a/Geo/CellComplex.h b/Geo/CellComplex.h
index 326521e7bf47241528b9e1ac9cdcf3b3534c26bd..f3d8c0ac9f284eb86a18470f0111ad71a00a3fd6 100644
--- a/Geo/CellComplex.h
+++ b/Geo/CellComplex.h
@@ -38,12 +38,21 @@ class CellComplex
   std::vector<Cell*> _newcells;
   std::vector<Cell*> _removedcells;
 
+  // cell complex dimension
   int _dim;
+
+  // cell are simplexes
   bool _simplicial;
+
+  // save the original unreduced complex for another reduction run
   bool _saveorig;
 
+  // has a relative subdomain
+  bool _relative;
+
   int _deleteCount;
 
+  // is the cell complex at reduced state
   bool _reduced;
 
   // for constructor
@@ -76,8 +85,9 @@ class CellComplex
 
 
   GModel* getModel() const { return _model; }
-  int getDim() { return _dim; }
-  bool simplicial() { return _simplicial; }
+  int getDim() const { return _dim; }
+  bool simplicial() const { return _simplicial; }
+  bool relative() const { return _relative; }
 
   // get the number of certain dimensional cells
   int getSize(int dim, bool orig=false){
@@ -110,6 +120,9 @@ class CellComplex
   // remove cells in subdomain from this cell complex
   void removeSubdomain();
 
+  // remove dim-dimensional cells from this cell complex
+  void removeCells(int dim);
+
   // (co)reduction of this cell complex
   // removes (co)reduction pairs of cell of dimension dim and dim-1
   int reduction(int dim, bool omit, std::vector<Cell*>& omittedCells);
@@ -125,10 +138,12 @@ class CellComplex
   // belong to this cell complex
   bool coherent();
 
-  // full (co)reduction of this cell complex (all dimensions, with combining)
-  // (with highest dimensional cell omitting?)
-  int reduceComplex(bool docombine=true, bool omit=true);
-  int coreduceComplex(bool docombine=true, bool omit=true);
+  // full (co)reduction of this cell complex (all dimensions)
+  // (combine = 1 -> with combining)
+  // (combine = 2 -> with combining and dual combining)
+  // (omit = true -> with highest dimensional cell omitting?)
+  int reduceComplex(int combine=1, bool omit=true);
+  int coreduceComplex(int combine=1, bool omit=true);
 
   bool isReduced() const { return _reduced; }
 
diff --git a/Geo/Chain.h b/Geo/Chain.h
index 5921b5589641c039446057fd5f308c1f938f1ccf..a1db553d08707313a0d2af57fb59dc1161e5d370 100644
--- a/Geo/Chain.h
+++ b/Geo/Chain.h
@@ -417,7 +417,7 @@ void Chain<C>::addElemChain(const ElemChain& c, C coeff)
 {
   if(coeff == 0) return;
   if(_dim != -1 && _dim != c.getDim()) {
-    Msg::Error("Cannot add elementrary d%-chain to %d-chain",
+    Msg::Error("Cannot add elementrary %d-chain to %d-chain",
                c.getDim(), _dim);
     return;
   }
diff --git a/Geo/ChainComplex.cpp b/Geo/ChainComplex.cpp
index bf57dcf797623f0900da4427ff5b192bc95d4a02..2d8fb36c989e8583c1c0a0452614ee542867e9bc 100644
--- a/Geo/ChainComplex.cpp
+++ b/Geo/ChainComplex.cpp
@@ -489,7 +489,7 @@ void ChainComplex::getBasisChain(std::map<Cell*, int, Less_Cell>& chain,
   }
   mpz_clear(elem);
 
-  if(deform && (dim == 1 || dim == 2) ) smoothenChain(chain);
+  if(deform && basis == 3 && (dim == 1 || dim == 2) ) smoothenChain(chain);
 }
 
 int ChainComplex::getBasisSize(int dim, int basis)
diff --git a/Geo/GModel.cpp b/Geo/GModel.cpp
index 2450a74e37f3bf80653a2ac34be7ad91165a6480..79c482bdeee8dfbf068d490a78ffc1b20ac95e44 100644
--- a/Geo/GModel.cpp
+++ b/Geo/GModel.cpp
@@ -3204,6 +3204,7 @@ void GModel::computeHomology()
         itt != itp.second; itt++){
       std::string type = itt->second.first;
       std::vector<int> dim = itt->second.second;
+      if(dim.empty()) for(int i = 0; i < 4; i++) dim.push_back(i);
 
       std::stringstream ss;
       for(unsigned int i = 0; i < dim.size(); i++) {
@@ -3220,14 +3221,14 @@ void GModel::computeHomology()
       std::string dims = ss.str();
 
       if(type == "Homology") {
-        homology->findHomologyBasis();
+        homology->findHomologyBasis(dim);
         Msg::Info("Homology space basis chains to save: %s.", dims.c_str());
         for(unsigned int i = 0; i < dim.size(); i++)
           if(dim.at(i) >= 0 && dim.at(i) <= getDim())
             homology->addChainsToModel(dim.at(i));
       }
       else if(type == "Cohomology") {
-        homology->findCohomologyBasis();
+        homology->findCohomologyBasis(dim);
         Msg::Info("Cohomology space basis cochains to save: %s.", dims.c_str());
         for(unsigned int i = 0; i < dim.size(); i++)
           if(dim.at(i) >= 0 && dim.at(i) <= getDim())
diff --git a/Geo/Homology.cpp b/Geo/Homology.cpp
index 0a11ccd09a797f70d5b9e2f91f342c155e4f83db..a9db40d532232c597332285637a8e4d78e1435c9 100644
--- a/Geo/Homology.cpp
+++ b/Geo/Homology.cpp
@@ -19,11 +19,10 @@ Homology::Homology(GModel* model,
 		   std::vector<int> physicalSubdomain,
                    std::vector<int> physicalImdomain,
                    bool saveOrig,
-		   bool combine, bool omit, bool smoothen) :
+		   int combine, bool omit, bool smoothen) :
   _model(model), _domain(physicalDomain), _subdomain(physicalSubdomain),
   _imdomain(physicalImdomain), _saveOrig(saveOrig),
-  _combine(combine), _omit(omit), _smoothen(smoothen), _cellComplex(NULL),
-  _homologyComputed(false), _cohomologyComputed(false)
+  _combine(combine), _omit(omit), _smoothen(smoothen), _cellComplex(NULL)
 {
   _fileName = "";
 
@@ -45,6 +44,11 @@ Homology::Homology(GModel* model,
     _getEntities(_imdomain, _immuneEntities);
   }
 
+  for(unsigned int i = 0; i < 4; i++) {
+    _homologyComputed[i] = false;
+    _cohomologyComputed[i] = false;
+    _betti[i] = -1;
+  }
 }
 
 void Homology::_getEntities(const std::vector<int>& physicalGroups,
@@ -119,26 +123,44 @@ void Homology::_createCellComplex()
 	    _cellComplex->getSize(1), _cellComplex->getSize(0));
 }
 
-void Homology::_deleteChains()
+void Homology::_deleteChains(std::vector<int> dim)
 {
-  for(int j = 0; j < 4; j ++) {
-    for(unsigned int i = 0; i < _chains[j].size(); i++) {
-      delete _chains[j].at(i);
-      _chains[j].clear();
+  if(dim.empty()) {
+    std::vector<int> alldim(4);
+    for(int i = 0; i < 4; i++) alldim[i] = i;
+    _deleteChains(alldim);
+    return;
+  }
+
+  for(unsigned int j = 0; j < dim.size(); j ++) {
+    int d = dim.at(j);
+    if(d < 0 || d > 3) continue;
+    for(unsigned int i = 0; i < _chains[d].size(); i++) {
+      delete _chains[d].at(i);
+      _chains[d].clear();
     }
+    _homologyComputed[d] = false;
   }
-  _homologyComputed = false;
 }
 
-void Homology::_deleteCochains()
+void Homology::_deleteCochains(std::vector<int> dim)
 {
-  for(int j = 0; j < 4; j ++) {
-    for(unsigned int i = 0; i < _cochains[j].size(); i++) {
-      delete _cochains[j].at(i);
-      _cochains[j].clear();
+  if(dim.empty()) {
+    std::vector<int> alldim(4);
+    for(int i = 0; i < 4; i++) alldim[i] = i;
+    _deleteCochains(alldim);
+    return;
+  }
+
+  for(unsigned int j = 0; j < dim.size(); j ++) {
+    int d = dim.at(j);
+    if(d < 0 || d > 3) continue;
+    for(unsigned int i = 0; i < _cochains[d].size(); i++) {
+      delete _cochains[d].at(i);
+      _cochains[d].clear();
     }
+    _cohomologyComputed[d] = false;
   }
-  _cohomologyComputed = false;
 }
 
 Homology::~Homology()
@@ -148,7 +170,7 @@ Homology::~Homology()
   _deleteCochains();
 }
 
-void Homology::findHomologyBasis()
+void Homology::findHomologyBasis(std::vector<int> dim)
 {
   if(_cellComplex == NULL) _createCellComplex();
   if(_cellComplex->isReduced()) _cellComplex->restoreComplex();
@@ -157,6 +179,14 @@ void Homology::findHomologyBasis()
   double t1 = Cpu();
   int omitted = _cellComplex->reduceComplex(_combine, _omit);
 
+  if(!dim.empty() && _combine > 1) {
+    for(int i = 1; i <= 3;  i++) {
+      if(!std::binary_search(dim.begin(), dim.end(), i)) {
+        _cellComplex->cocombine(i-1);
+      }
+    }
+  }
+
   double t2 = Cpu();
   Msg::StatusBar(2, true, "Done reducing cell complex (%g s)", t2 - t1);
   Msg::Info("%d volumes, %d faces, %d edges, and %d vertices",
@@ -171,10 +201,9 @@ void Homology::findHomologyBasis()
   Msg::StatusBar(2, true, "Done computing homology space bases (%g s)", t2 - t1);
 
   std::string domain = _getDomainString(_domain, _subdomain);
-  _deleteChains();
-  int HRank[4];
+  _deleteChains(dim);
   for(int j = 0; j < 4; j++){
-    HRank[j] = 0;
+    _betti[j] = 0;
     std::string dimension = "";
     convert(j, dimension);
     for(int i = 1; i <= chainComplex.getBasisSize(j, 3); i++){
@@ -188,7 +217,7 @@ void Homology::findHomologyBasis()
       int torsion = chainComplex.getTorsion(j,i);
       if(!chain.empty()) {
         _createChain(chain, name, false);
-        HRank[j] = HRank[j] + 1;
+        _betti[j] = _betti[j] + 1;
         if(torsion != 1){
           Msg::Warning("H_%d %d has torsion coefficient %d!",
                        j, i, torsion);
@@ -200,18 +229,26 @@ void Homology::findHomologyBasis()
   if(_fileName != "") writeBasisMSH();
 
   Msg::Info("Ranks of domain %shomology spaces:", domain.c_str());
-  Msg::Info("H_0 = %d", HRank[0]);
-  Msg::Info("H_1 = %d", HRank[1]);
-  Msg::Info("H_2 = %d", HRank[2]);
-  Msg::Info("H_3 = %d", HRank[3]);
+  Msg::Info("H_0 = %d", _betti[0]);
+  Msg::Info("H_1 = %d", _betti[1]);
+  Msg::Info("H_2 = %d", _betti[2]);
+  Msg::Info("H_3 = %d", _betti[3]);
   if(omitted != 0) Msg::Info("The computation of basis elements in the highest dimension was omitted");
 
   Msg::StatusBar(2, false, "H_0: %d, H_1: %d, H_2: %d, H_3: %d",
-		 HRank[0], HRank[1], HRank[2], HRank[3]);
-  _homologyComputed = true;
+		 _betti[0], _betti[1], _betti[2], _betti[3]);
+
+  if(dim.empty()) {
+    for(unsigned int i = 0; i < 4; i++)
+      _homologyComputed[i] = true;
+  }
+  else {
+    for(unsigned int i = 0; i < dim.size(); i++)
+      _homologyComputed[dim.at(i)] = true;
+  }
 }
 
-void Homology::findCohomologyBasis()
+void Homology::findCohomologyBasis(std::vector<int> dim)
 {
   if(_cellComplex == NULL) _createCellComplex();
   if(_cellComplex->isReduced()) _cellComplex->restoreComplex();
@@ -219,11 +256,22 @@ void Homology::findCohomologyBasis()
   Msg::StatusBar(2, true, "Reducing cell complex...");
 
   double t1 = Cpu();
+
   int omitted = _cellComplex->coreduceComplex(_combine, _omit);
+
+  std::sort(dim.begin(), dim.end());
+  if(!dim.empty()  && _combine > 1) {
+    for(int i = 2; i >= 0;  i--) {
+      if(!std::binary_search(dim.begin(), dim.end(), i)) {
+        _cellComplex->combine(i+1);
+      }
+    }
+  }
+
   double t2 = Cpu();
 
   Msg::StatusBar(2, true, "Done reducing cell complex (%g s)", t2 - t1);
-  Msg::Info("%d volumes, %d faces, %d edges and %d vertices",
+  Msg::Info("%d volumes, %d faces, %d edges, and %d vertices",
             _cellComplex->getSize(3), _cellComplex->getSize(2),
 	    _cellComplex->getSize(1), _cellComplex->getSize(0));
 
@@ -236,9 +284,8 @@ void Homology::findCohomologyBasis()
   Msg::StatusBar(2, true, "Done computing cohomology space bases (%g s)", t2- t1);
 
   std::string domain = _getDomainString(_domain, _subdomain);
-  _deleteCochains();
-  int HRank[4];
-  for(int i = 0; i < 4; i++) HRank[i] = 0;
+  _deleteCochains(dim);
+  for(int i = 0; i < 4; i++) _betti[i] = 0;
   for(int j = 3; j > -1; j--){
     std::string dimension = "";
     convert(j, dimension);
@@ -254,7 +301,7 @@ void Homology::findCohomologyBasis()
       int torsion = chainComplex.getTorsion(j,i);
       if(!chain.empty()) {
         _createChain(chain, name, true);
-        HRank[j] = HRank[j] + 1;
+        _betti[j] = _betti[j] + 1;
         if(torsion != 1){
           Msg::Warning("H^%d %d has torsion coefficient %d!", j, i, torsion);
         }
@@ -265,21 +312,30 @@ void Homology::findCohomologyBasis()
   if(_fileName != "") writeBasisMSH();
 
   Msg::Info("Ranks of domain %scohomology spaces:", domain.c_str());
-  Msg::Info("H^0 = %d", HRank[0]);
-  Msg::Info("H^1 = %d", HRank[1]);
-  Msg::Info("H^2 = %d", HRank[2]);
-  Msg::Info("H^3 = %d", HRank[3]);
+  Msg::Info("H^0 = %d", _betti[0]);
+  Msg::Info("H^1 = %d", _betti[1]);
+  Msg::Info("H^2 = %d", _betti[2]);
+  Msg::Info("H^3 = %d", _betti[3]);
   if(omitted != 0) Msg::Info("The computation of basis elements in the highest dimension was omitted");
 
   Msg::StatusBar(2, false, "H^0: %d, H^1: %d, H^2: %d, H^3: %d",
-		 HRank[0], HRank[1], HRank[2], HRank[3]);
-  _cohomologyComputed = true;
+		 _betti[0], _betti[1], _betti[2], _betti[3]);
+
+  if(dim.empty()) {
+    for(unsigned int i = 0; i < 4; i++)
+      _cohomologyComputed[i] = true;
+  }
+  else {
+    for(unsigned int i = 0; i < dim.size(); i++)
+      _cohomologyComputed[dim.at(i)] = true;
+  }
 }
 
 void Homology::addChainsToModel(int dim, bool post, int physicalNumRequest)
 {
   int pgnum = -1;
-  if(!_homologyComputed) Msg::Warning("Homology is not computed");
+  if(!_homologyComputed[dim])
+    Msg::Warning("%d-Homology is not computed", dim);
   if(dim == -1) {
     for(int j = 0; j < 4; j++) {
       for(unsigned int i = 0; i < _chains[j].size(); i++) {
@@ -301,7 +357,8 @@ void Homology::addChainsToModel(int dim, bool post, int physicalNumRequest)
 void Homology::addCochainsToModel(int dim, bool post, int physicalNumRequest)
 {
   int pgnum = -1;
-  if(!_cohomologyComputed) Msg::Warning("Cohomology is not computed");
+  if(!_cohomologyComputed[dim])
+    Msg::Warning("%d-Cohomology is not computed", dim);
   if(dim == -1) {
     for(int j = 0; j < 4; j++) {
       for(unsigned int i = 0; i < _cochains[j].size(); i++) {
@@ -323,7 +380,7 @@ void Homology::addCochainsToModel(int dim, bool post, int physicalNumRequest)
 void Homology::getHomologyBasis(int dim, std::vector<Chain<int> >& hom)
 {
   if(dim < 0 || dim > 3) return;
-  if(!_homologyComputed) findHomologyBasis();
+  if(!_homologyComputed[dim]) findHomologyBasis();
 
   hom.resize(_chains[dim].size());
   for(unsigned int i = 0; i < _chains[dim].size(); i++)
@@ -333,7 +390,7 @@ void Homology::getHomologyBasis(int dim, std::vector<Chain<int> >& hom)
 void Homology::getCohomologyBasis(int dim, std::vector<Chain<int> >& coh)
 {
   if(dim < 0 || dim > 3) return;
-  if(!_cohomologyComputed) findCohomologyBasis();
+  if(!_cohomologyComputed[dim]) findCohomologyBasis();
 
   coh.resize(_cochains[dim].size());
   for(unsigned int i = 0; i < _cochains[dim].size(); i++)
@@ -343,11 +400,10 @@ void Homology::getCohomologyBasis(int dim, std::vector<Chain<int> >& coh)
 int Homology::betti(int dim)
 {
   if(dim < 0 || dim > 3) return 0;
-  if(_homologyComputed) return _chains[dim].size();
-  if(_cohomologyComputed) return _cochains[dim].size();
+  if(_betti[dim] != -1) return _betti[dim];
 
   findHomologyBasis();
-  return _chains[dim].size();
+  return _betti[dim];
 }
 
 int Homology::eulerCharacteristic()
diff --git a/Geo/Homology.h b/Geo/Homology.h
index 320b913f339ecc5b7f497ab26d5c94ff54414dea..0af68cbd80ef5d7619a7f91230f6515d89a2dcee 100644
--- a/Geo/Homology.h
+++ b/Geo/Homology.h
@@ -44,7 +44,7 @@ class Homology
   bool _saveOrig;
 
   // use cell combining
-  bool _combine;
+  int _combine;
   // use cell omit
   bool _omit;
   // use chain smoothning
@@ -56,10 +56,11 @@ class Homology
   // cell complex of the domain
   CellComplex* _cellComplex;
 
-  bool _homologyComputed;
-  bool _cohomologyComputed;
+  bool _homologyComputed[4];
+  bool _cohomologyComputed[4];
 
-  // resulting chains
+  // resulting betti numbers and chains
+  int _betti[4];
   std::vector<Chain<int>*> _chains[4];
   std::vector<Chain<int>*> _cochains[4];
 
@@ -81,8 +82,8 @@ class Homology
   void _createChain(std::map<Cell*, int, Less_Cell>& preChain,
                     std::string name, bool co);
 
-  void _deleteChains();
-  void _deleteCochains();
+  void _deleteChains(std::vector<int> dim=std::vector<int>());
+  void _deleteCochains(std::vector<int> dim=std::vector<int>());
 
  public:
 
@@ -92,15 +93,17 @@ class Homology
 	   std::vector<int> physicalSubdomain,
            std::vector<int> physicalIm,
            bool saveOrig=true,
-	   bool combine=true, bool omit=true, bool smoothen=true);
+	   int combine=2, bool omit=true, bool smoothen=true);
   ~Homology();
 
   GModel* getModel() const { return _model; }
   void setFileName(std::string fileName) { _fileName = fileName; }
 
   // find the bases of (co)homology spaces
-  void findHomologyBasis();
-  void findCohomologyBasis();
+  // if dim is empty, find 0-,1-,2-,3-(co)homology spaces bases
+  // otherwise only find those indicated in dim
+  void findHomologyBasis(std::vector<int> dim=std::vector<int>());
+  void findCohomologyBasis(std::vector<int> dim=std::vector<int>());
 
   // add chains to Gmsh model
   // dim: only add dim-chains if dim != -1
@@ -113,10 +116,10 @@ class Homology
   void getHomologyBasis(int dim, std::vector<Chain<int> >& hom);
   void getCohomologyBasis(int dim, std::vector<Chain<int> >& coh);
 
-  // get Betti number
+  // get a Betti number
   int betti(int dim);
 
-  // get Euler characteristic
+  // get the Euler characteristic
   int eulerCharacteristic();
 
   // write the generators to a file
diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp
index 7e32b0d11f0df7ffbe5b1813f542373a668a3128..10de261d28ff6e1efe52679e7688048d263af082 100644
--- a/Parser/Gmsh.tab.cpp
+++ b/Parser/Gmsh.tab.cpp
@@ -1,9 +1,8 @@
-/* A Bison parser, made by GNU Bison 2.4.3.  */
+/* A Bison parser, made by GNU Bison 2.5.  */
 
-/* Skeleton implementation for Bison's Yacc-like parsers in C
+/* Bison implementation for Yacc-like parsers in C
    
-      Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
-   2009, 2010 Free Software Foundation, Inc.
+      Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -45,7 +44,7 @@
 #define YYBISON 1
 
 /* Bison version.  */
-#define YYBISON_VERSION "2.4.3"
+#define YYBISON_VERSION "2.5"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -74,7 +73,7 @@
 
 /* Copy the first part of user declarations.  */
 
-/* Line 189 of yacc.c  */
+/* Line 268 of yacc.c  */
 #line 1 "Gmsh.y"
 
 // Gmsh - Copyright (C) 1997-2012 C. Geuzaine, J.-F. Remacle
@@ -167,8 +166,8 @@ struct doubleXstring{
 
 
 
-/* Line 189 of yacc.c  */
-#line 172 "Gmsh.tab.cpp"
+/* Line 268 of yacc.c  */
+#line 171 "Gmsh.tab.cpp"
 
 /* Enabling traces.  */
 #ifndef YYDEBUG
@@ -341,7 +340,7 @@ struct doubleXstring{
 typedef union YYSTYPE
 {
 
-/* Line 214 of yacc.c  */
+/* Line 293 of yacc.c  */
 #line 92 "Gmsh.y"
 
   char *c;
@@ -354,8 +353,8 @@ typedef union YYSTYPE
 
 
 
-/* Line 214 of yacc.c  */
-#line 359 "Gmsh.tab.cpp"
+/* Line 293 of yacc.c  */
+#line 358 "Gmsh.tab.cpp"
 } YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
@@ -366,8 +365,8 @@ typedef union YYSTYPE
 /* Copy the second part of user declarations.  */
 
 
-/* Line 264 of yacc.c  */
-#line 371 "Gmsh.tab.cpp"
+/* Line 343 of yacc.c  */
+#line 370 "Gmsh.tab.cpp"
 
 #ifdef short
 # undef short
@@ -470,11 +469,11 @@ YYID (yyi)
 #    define alloca _alloca
 #   else
 #    define YYSTACK_ALLOC alloca
-#    if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
      || defined __cplusplus || defined _MSC_VER)
 #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-#     ifndef _STDLIB_H
-#      define _STDLIB_H 1
+#     ifndef EXIT_SUCCESS
+#      define EXIT_SUCCESS 0
 #     endif
 #    endif
 #   endif
@@ -497,24 +496,24 @@ YYID (yyi)
 #  ifndef YYSTACK_ALLOC_MAXIMUM
 #   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
 #  endif
-#  if (defined __cplusplus && ! defined _STDLIB_H \
+#  if (defined __cplusplus && ! defined EXIT_SUCCESS \
        && ! ((defined YYMALLOC || defined malloc) \
 	     && (defined YYFREE || defined free)))
 #   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-#   ifndef _STDLIB_H
-#    define _STDLIB_H 1
+#   ifndef EXIT_SUCCESS
+#    define EXIT_SUCCESS 0
 #   endif
 #  endif
 #  ifndef YYMALLOC
 #   define YYMALLOC malloc
-#   if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+#   if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
      || defined __cplusplus || defined _MSC_VER)
 void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
 #   endif
 #  endif
 #  ifndef YYFREE
 #   define YYFREE free
-#   if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+#   if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
      || defined __cplusplus || defined _MSC_VER)
 void free (void *); /* INFRINGES ON USER NAME SPACE */
 #   endif
@@ -543,23 +542,7 @@ union yyalloc
      ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
       + YYSTACK_GAP_MAXIMUM)
 
-/* Copy COUNT objects from FROM to TO.  The source and destination do
-   not overlap.  */
-# ifndef YYCOPY
-#  if defined __GNUC__ && 1 < __GNUC__
-#   define YYCOPY(To, From, Count) \
-      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
-#  else
-#   define YYCOPY(To, From, Count)		\
-      do					\
-	{					\
-	  YYSIZE_T yyi;				\
-	  for (yyi = 0; yyi < (Count); yyi++)	\
-	    (To)[yyi] = (From)[yyi];		\
-	}					\
-      while (YYID (0))
-#  endif
-# endif
+# define YYCOPY_NEEDED 1
 
 /* Relocate STACK from its old location to the new one.  The
    local variables YYSIZE and YYSTACKSIZE give the old and new number of
@@ -579,6 +562,26 @@ union yyalloc
 
 #endif
 
+#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
+/* Copy COUNT objects from FROM to TO.  The source and destination do
+   not overlap.  */
+# ifndef YYCOPY
+#  if defined __GNUC__ && 1 < __GNUC__
+#   define YYCOPY(To, From, Count) \
+      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#  else
+#   define YYCOPY(To, From, Count)		\
+      do					\
+	{					\
+	  YYSIZE_T yyi;				\
+	  for (yyi = 0; yyi < (Count); yyi++)	\
+	    (To)[yyi] = (From)[yyi];		\
+	}					\
+      while (YYID (0))
+#  endif
+# endif
+#endif /* !YYCOPY_NEEDED */
+
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  5
 /* YYLAST -- Last index in YYTABLE.  */
@@ -974,21 +977,21 @@ static const yytype_uint16 yyrline[] =
     3158,  3162,  3166,  3185,  3198,  3201,  3217,  3220,  3233,  3236,
     3242,  3245,  3252,  3308,  3378,  3383,  3450,  3486,  3495,  3538,
     3563,  3590,  3634,  3657,  3680,  3683,  3692,  3696,  3706,  3741,
-    3742,  3746,  3753,  3766,  3785,  3813,  3814,  3815,  3816,  3817,
-    3818,  3819,  3820,  3821,  3828,  3829,  3830,  3831,  3832,  3833,
-    3834,  3835,  3836,  3837,  3838,  3839,  3840,  3841,  3842,  3843,
-    3844,  3845,  3846,  3847,  3848,  3849,  3850,  3851,  3852,  3853,
-    3854,  3855,  3856,  3857,  3858,  3859,  3861,  3862,  3863,  3864,
-    3865,  3866,  3867,  3868,  3869,  3870,  3871,  3872,  3873,  3874,
-    3875,  3876,  3877,  3878,  3879,  3880,  3881,  3890,  3891,  3892,
-    3893,  3894,  3895,  3896,  3900,  3920,  3939,  3957,  3969,  3986,
-    4007,  4012,  4017,  4027,  4037,  4045,  4049,  4053,  4057,  4061,
-    4068,  4072,  4076,  4080,  4087,  4092,  4099,  4104,  4108,  4113,
-    4117,  4125,  4136,  4140,  4152,  4160,  4168,  4175,  4186,  4206,
-    4210,  4214,  4218,  4222,  4240,  4258,  4276,  4294,  4304,  4314,
-    4326,  4338,  4359,  4364,  4368,  4372,  4384,  4388,  4400,  4407,
-    4417,  4421,  4436,  4441,  4448,  4452,  4465,  4473,  4484,  4488,
-    4496,  4504,  4512,  4520,  4534,  4548,  4552
+    3742,  3746,  3751,  3762,  3779,  3807,  3808,  3809,  3810,  3811,
+    3812,  3813,  3814,  3815,  3822,  3823,  3824,  3825,  3826,  3827,
+    3828,  3829,  3830,  3831,  3832,  3833,  3834,  3835,  3836,  3837,
+    3838,  3839,  3840,  3841,  3842,  3843,  3844,  3845,  3846,  3847,
+    3848,  3849,  3850,  3851,  3852,  3853,  3855,  3856,  3857,  3858,
+    3859,  3860,  3861,  3862,  3863,  3864,  3865,  3866,  3867,  3868,
+    3869,  3870,  3871,  3872,  3873,  3874,  3875,  3884,  3885,  3886,
+    3887,  3888,  3889,  3890,  3894,  3914,  3933,  3951,  3963,  3980,
+    4001,  4006,  4011,  4021,  4031,  4039,  4043,  4047,  4051,  4055,
+    4062,  4066,  4070,  4074,  4081,  4086,  4093,  4098,  4102,  4107,
+    4111,  4119,  4130,  4134,  4146,  4154,  4162,  4169,  4180,  4200,
+    4204,  4208,  4212,  4216,  4234,  4252,  4270,  4288,  4298,  4308,
+    4320,  4332,  4353,  4358,  4362,  4366,  4378,  4382,  4394,  4401,
+    4411,  4415,  4430,  4435,  4442,  4446,  4459,  4467,  4478,  4482,
+    4490,  4498,  4506,  4514,  4528,  4542,  4546
 };
 #endif
 
@@ -1165,8 +1168,8 @@ static const yytype_uint8 yyr2[] =
        4,     6,     6,     4,     4,     4,     6
 };
 
-/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
-   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
+/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
+   Performed when YYTABLE doesn't specify something else to do.  Zero
    means the default is an error.  */
 static const yytype_uint16 yydefact[] =
 {
@@ -1505,8 +1508,7 @@ static const yytype_int16 yypgoto[] =
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
-   number is the opposite.  If zero, do what YYDEFACT says.
-   If YYTABLE_NINF, syntax error.  */
+   number is the opposite.  If YYTABLE_NINF, syntax error.  */
 #define YYTABLE_NINF -5
 static const yytype_int16 yytable[] =
 {
@@ -2270,6 +2272,12 @@ static const yytype_int16 yytable[] =
        0,     0,     0,   355
 };
 
+#define yypact_value_is_default(yystate) \
+  ((yystate) == (-1103))
+
+#define yytable_value_is_error(yytable_value) \
+  YYID (0)
+
 static const yytype_int16 yycheck[] =
 {
        6,  1103,   208,     6,     6,   406,   407,     5,     7,   327,
@@ -3219,7 +3227,6 @@ do								\
     {								\
       yychar = (Token);						\
       yylval = (Value);						\
-      yytoken = YYTRANSLATE (yychar);				\
       YYPOPSTACK (1);						\
       goto yybackup;						\
     }								\
@@ -3261,19 +3268,10 @@ while (YYID (0))
 #endif
 
 
-/* YY_LOCATION_PRINT -- Print the location on the stream.
-   This macro was not mandated originally: define only if we know
-   we won't break user code: when these are the locations we know.  */
+/* This macro is provided for backward compatibility. */
 
 #ifndef YY_LOCATION_PRINT
-# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
-#  define YY_LOCATION_PRINT(File, Loc)			\
-     fprintf (File, "%d.%d-%d.%d",			\
-	      (Loc).first_line, (Loc).first_column,	\
-	      (Loc).last_line,  (Loc).last_column)
-# else
-#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-# endif
+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
 #endif
 
 
@@ -3465,7 +3463,6 @@ int yydebug;
 # define YYMAXDEPTH 10000
 #endif
 
-
 
 #if YYERROR_VERBOSE
 
@@ -3568,115 +3565,142 @@ yytnamerr (char *yyres, const char *yystr)
 }
 # endif
 
-/* Copy into YYRESULT an error message about the unexpected token
-   YYCHAR while in state YYSTATE.  Return the number of bytes copied,
-   including the terminating null byte.  If YYRESULT is null, do not
-   copy anything; just return the number of bytes that would be
-   copied.  As a special case, return 0 if an ordinary "syntax error"
-   message will do.  Return YYSIZE_MAXIMUM if overflow occurs during
-   size calculation.  */
-static YYSIZE_T
-yysyntax_error (char *yyresult, int yystate, int yychar)
-{
-  int yyn = yypact[yystate];
+/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
+   about the unexpected token YYTOKEN for the state stack whose top is
+   YYSSP.
 
-  if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
-    return 0;
-  else
-    {
-      int yytype = YYTRANSLATE (yychar);
-      YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
-      YYSIZE_T yysize = yysize0;
-      YYSIZE_T yysize1;
-      int yysize_overflow = 0;
-      enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
-      char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
-      int yyx;
-
-# if 0
-      /* This is so xgettext sees the translatable formats that are
-	 constructed on the fly.  */
-      YY_("syntax error, unexpected %s");
-      YY_("syntax error, unexpected %s, expecting %s");
-      YY_("syntax error, unexpected %s, expecting %s or %s");
-      YY_("syntax error, unexpected %s, expecting %s or %s or %s");
-      YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
-# endif
-      char *yyfmt;
-      char const *yyf;
-      static char const yyunexpected[] = "syntax error, unexpected %s";
-      static char const yyexpecting[] = ", expecting %s";
-      static char const yyor[] = " or %s";
-      char yyformat[sizeof yyunexpected
-		    + sizeof yyexpecting - 1
-		    + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
-		       * (sizeof yyor - 1))];
-      char const *yyprefix = yyexpecting;
-
-      /* Start YYX at -YYN if negative to avoid negative indexes in
-	 YYCHECK.  */
-      int yyxbegin = yyn < 0 ? -yyn : 0;
-
-      /* Stay within bounds of both yycheck and yytname.  */
-      int yychecklim = YYLAST - yyn + 1;
-      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
-      int yycount = 1;
-
-      yyarg[0] = yytname[yytype];
-      yyfmt = yystpcpy (yyformat, yyunexpected);
-
-      for (yyx = yyxbegin; yyx < yyxend; ++yyx)
-	if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
-	  {
-	    if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
-	      {
-		yycount = 1;
-		yysize = yysize0;
-		yyformat[sizeof yyunexpected - 1] = '\0';
-		break;
-	      }
-	    yyarg[yycount++] = yytname[yyx];
-	    yysize1 = yysize + yytnamerr (0, yytname[yyx]);
-	    yysize_overflow |= (yysize1 < yysize);
-	    yysize = yysize1;
-	    yyfmt = yystpcpy (yyfmt, yyprefix);
-	    yyprefix = yyor;
-	  }
+   Return 0 if *YYMSG was successfully written.  Return 1 if *YYMSG is
+   not large enough to hold the message.  In that case, also set
+   *YYMSG_ALLOC to the required number of bytes.  Return 2 if the
+   required number of bytes is too large to store.  */
+static int
+yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
+                yytype_int16 *yyssp, int yytoken)
+{
+  YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]);
+  YYSIZE_T yysize = yysize0;
+  YYSIZE_T yysize1;
+  enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+  /* Internationalized format string. */
+  const char *yyformat = 0;
+  /* Arguments of yyformat. */
+  char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+  /* Number of reported tokens (one for the "unexpected", one per
+     "expected"). */
+  int yycount = 0;
+
+  /* There are many possibilities here to consider:
+     - Assume YYFAIL is not used.  It's too flawed to consider.  See
+       <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
+       for details.  YYERROR is fine as it does not invoke this
+       function.
+     - If this state is a consistent state with a default action, then
+       the only way this function was invoked is if the default action
+       is an error action.  In that case, don't check for expected
+       tokens because there are none.
+     - The only way there can be no lookahead present (in yychar) is if
+       this state is a consistent state with a default action.  Thus,
+       detecting the absence of a lookahead is sufficient to determine
+       that there is no unexpected or expected token to report.  In that
+       case, just report a simple "syntax error".
+     - Don't assume there isn't a lookahead just because this state is a
+       consistent state with a default action.  There might have been a
+       previous inconsistent state, consistent state with a non-default
+       action, or user semantic action that manipulated yychar.
+     - Of course, the expected token list depends on states to have
+       correct lookahead information, and it depends on the parser not
+       to perform extra reductions after fetching a lookahead from the
+       scanner and before detecting a syntax error.  Thus, state merging
+       (from LALR or IELR) and default reductions corrupt the expected
+       token list.  However, the list is correct for canonical LR with
+       one exception: it will still contain any token that will not be
+       accepted due to an error action in a later state.
+  */
+  if (yytoken != YYEMPTY)
+    {
+      int yyn = yypact[*yyssp];
+      yyarg[yycount++] = yytname[yytoken];
+      if (!yypact_value_is_default (yyn))
+        {
+          /* Start YYX at -YYN if negative to avoid negative indexes in
+             YYCHECK.  In other words, skip the first -YYN actions for
+             this state because they are default actions.  */
+          int yyxbegin = yyn < 0 ? -yyn : 0;
+          /* Stay within bounds of both yycheck and yytname.  */
+          int yychecklim = YYLAST - yyn + 1;
+          int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+          int yyx;
+
+          for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+            if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
+                && !yytable_value_is_error (yytable[yyx + yyn]))
+              {
+                if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+                  {
+                    yycount = 1;
+                    yysize = yysize0;
+                    break;
+                  }
+                yyarg[yycount++] = yytname[yyx];
+                yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+                if (! (yysize <= yysize1
+                       && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+                  return 2;
+                yysize = yysize1;
+              }
+        }
+    }
 
-      yyf = YY_(yyformat);
-      yysize1 = yysize + yystrlen (yyf);
-      yysize_overflow |= (yysize1 < yysize);
-      yysize = yysize1;
+  switch (yycount)
+    {
+# define YYCASE_(N, S)                      \
+      case N:                               \
+        yyformat = S;                       \
+      break
+      YYCASE_(0, YY_("syntax error"));
+      YYCASE_(1, YY_("syntax error, unexpected %s"));
+      YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
+      YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
+      YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
+      YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
+# undef YYCASE_
+    }
 
-      if (yysize_overflow)
-	return YYSIZE_MAXIMUM;
+  yysize1 = yysize + yystrlen (yyformat);
+  if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+    return 2;
+  yysize = yysize1;
 
-      if (yyresult)
-	{
-	  /* Avoid sprintf, as that infringes on the user's name space.
-	     Don't have undefined behavior even if the translation
-	     produced a string with the wrong number of "%s"s.  */
-	  char *yyp = yyresult;
-	  int yyi = 0;
-	  while ((*yyp = *yyf) != '\0')
-	    {
-	      if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
-		{
-		  yyp += yytnamerr (yyp, yyarg[yyi++]);
-		  yyf += 2;
-		}
-	      else
-		{
-		  yyp++;
-		  yyf++;
-		}
-	    }
-	}
-      return yysize;
+  if (*yymsg_alloc < yysize)
+    {
+      *yymsg_alloc = 2 * yysize;
+      if (! (yysize <= *yymsg_alloc
+             && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
+        *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
+      return 1;
     }
+
+  /* Avoid sprintf, as that infringes on the user's name space.
+     Don't have undefined behavior even if the translation
+     produced a string with the wrong number of "%s"s.  */
+  {
+    char *yyp = *yymsg;
+    int yyi = 0;
+    while ((*yyp = *yyformat) != '\0')
+      if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
+        {
+          yyp += yytnamerr (yyp, yyarg[yyi++]);
+          yyformat += 2;
+        }
+      else
+        {
+          yyp++;
+          yyformat++;
+        }
+  }
+  return 0;
 }
 #endif /* YYERROR_VERBOSE */
-
 
 /*-----------------------------------------------.
 | Release the memory associated to this symbol.  |
@@ -3709,6 +3733,7 @@ yydestruct (yymsg, yytype, yyvaluep)
     }
 }
 
+
 /* Prevent warnings from -Wmissing-prototypes.  */
 #ifdef YYPARSE_PARAM
 #if defined __STDC__ || defined __cplusplus
@@ -3735,10 +3760,9 @@ YYSTYPE yylval;
 int yynerrs;
 
 
-
-/*-------------------------.
-| yyparse or yypush_parse.  |
-`-------------------------*/
+/*----------.
+| yyparse.  |
+`----------*/
 
 #ifdef YYPARSE_PARAM
 #if (defined __STDC__ || defined __C99__FUNC__ \
@@ -3762,8 +3786,6 @@ yyparse ()
 #endif
 #endif
 {
-
-
     int yystate;
     /* Number of tokens to shift before error messages enabled.  */
     int yyerrstatus;
@@ -3918,7 +3940,7 @@ yybackup:
 
   /* First try to decide what to do without reference to lookahead token.  */
   yyn = yypact[yystate];
-  if (yyn == YYPACT_NINF)
+  if (yypact_value_is_default (yyn))
     goto yydefault;
 
   /* Not known => get a lookahead token if don't already have one.  */
@@ -3949,8 +3971,8 @@ yybackup:
   yyn = yytable[yyn];
   if (yyn <= 0)
     {
-      if (yyn == 0 || yyn == YYTABLE_NINF)
-	goto yyerrlab;
+      if (yytable_value_is_error (yyn))
+        goto yyerrlab;
       yyn = -yyn;
       goto yyreduce;
     }
@@ -4005,171 +4027,171 @@ yyreduce:
     {
         case 3:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 164 "Gmsh.y"
-    { yyerrok; return 1; ;}
+    { yyerrok; return 1; }
     break;
 
   case 6:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 175 "Gmsh.y"
-    { return 1; ;}
+    { return 1; }
     break;
 
   case 7:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 176 "Gmsh.y"
-    { return 1; ;}
+    { return 1; }
     break;
 
   case 8:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 177 "Gmsh.y"
-    { return 1; ;}
+    { return 1; }
     break;
 
   case 9:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 178 "Gmsh.y"
-    { return 1; ;}
+    { return 1; }
     break;
 
   case 10:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 179 "Gmsh.y"
-    { List_Delete((yyvsp[(1) - (1)].l)); return 1; ;}
+    { List_Delete((yyvsp[(1) - (1)].l)); return 1; }
     break;
 
   case 11:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 180 "Gmsh.y"
-    { return 1; ;}
+    { return 1; }
     break;
 
   case 12:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 181 "Gmsh.y"
-    { return 1; ;}
+    { return 1; }
     break;
 
   case 13:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 182 "Gmsh.y"
-    { return 1; ;}
+    { return 1; }
     break;
 
   case 14:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 183 "Gmsh.y"
-    { List_Delete((yyvsp[(1) - (1)].l)); return 1; ;}
+    { List_Delete((yyvsp[(1) - (1)].l)); return 1; }
     break;
 
   case 15:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 184 "Gmsh.y"
-    { return 1; ;}
+    { return 1; }
     break;
 
   case 16:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 185 "Gmsh.y"
-    { return 1; ;}
+    { return 1; }
     break;
 
   case 17:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 186 "Gmsh.y"
-    { return 1; ;}
+    { return 1; }
     break;
 
   case 18:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 187 "Gmsh.y"
-    { return 1; ;}
+    { return 1; }
     break;
 
   case 19:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 188 "Gmsh.y"
-    { return 1; ;}
+    { return 1; }
     break;
 
   case 20:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 189 "Gmsh.y"
-    { return 1; ;}
+    { return 1; }
     break;
 
   case 21:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 190 "Gmsh.y"
-    { return 1; ;}
+    { return 1; }
     break;
 
   case 22:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 191 "Gmsh.y"
-    { return 1; ;}
+    { return 1; }
     break;
 
   case 23:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 196 "Gmsh.y"
     {
       (yyval.c) = (char*)"w";
-    ;}
+    }
     break;
 
   case 24:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 200 "Gmsh.y"
     {
       (yyval.c) = (char*)"a";
-    ;}
+    }
     break;
 
   case 25:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 207 "Gmsh.y"
     {
       Msg::Direct((yyvsp[(3) - (5)].c));
       Free((yyvsp[(3) - (5)].c));
-    ;}
+    }
     break;
 
   case 26:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 212 "Gmsh.y"
     {
       Msg::Error((yyvsp[(3) - (5)].c));
       Free((yyvsp[(3) - (5)].c));
-    ;}
+    }
     break;
 
   case 27:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 217 "Gmsh.y"
     {
       std::string tmp = FixRelativePath(gmsh_yyname, (yyvsp[(6) - (7)].c));
@@ -4183,12 +4205,12 @@ yyreduce:
       }
       Free((yyvsp[(3) - (7)].c));
       Free((yyvsp[(6) - (7)].c));
-    ;}
+    }
     break;
 
   case 28:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 231 "Gmsh.y"
     {
       char tmpstring[5000];
@@ -4201,12 +4223,12 @@ yyreduce:
 	Msg::Direct(tmpstring);
       Free((yyvsp[(3) - (7)].c));
       List_Delete((yyvsp[(5) - (7)].l));
-    ;}
+    }
     break;
 
   case 29:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 244 "Gmsh.y"
     {
       char tmpstring[5000];
@@ -4219,12 +4241,12 @@ yyreduce:
 	Msg::Error(tmpstring);
       Free((yyvsp[(3) - (7)].c));
       List_Delete((yyvsp[(5) - (7)].l));
-    ;}
+    }
     break;
 
   case 30:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 257 "Gmsh.y"
     {
       char tmpstring[5000];
@@ -4247,12 +4269,12 @@ yyreduce:
       Free((yyvsp[(3) - (9)].c));
       Free((yyvsp[(8) - (9)].c));
       List_Delete((yyvsp[(5) - (9)].l));
-    ;}
+    }
     break;
 
   case 31:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 285 "Gmsh.y"
     {
 #if defined(HAVE_POST)
@@ -4266,12 +4288,12 @@ yyreduce:
 	delete ViewData;
 #endif
       Free((yyvsp[(1) - (6)].c)); Free((yyvsp[(2) - (6)].c));
-    ;}
+    }
     break;
 
   case 32:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 299 "Gmsh.y"
     {
 #if defined(HAVE_POST)
@@ -4282,12 +4304,12 @@ yyreduce:
       }
 #endif
       Free((yyvsp[(2) - (6)].c));
-    ;}
+    }
     break;
 
   case 33:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 310 "Gmsh.y"
     {
 #if defined(HAVE_POST)
@@ -4298,51 +4320,51 @@ yyreduce:
       }
 #endif
       Free((yyvsp[(2) - (6)].c));
-    ;}
+    }
     break;
 
   case 34:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 324 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       ViewData = new PViewDataList();
 #endif
-    ;}
+    }
     break;
 
   case 40:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 338 "Gmsh.y"
-    { ViewCoord.push_back((yyvsp[(1) - (1)].d)); ;}
+    { ViewCoord.push_back((yyvsp[(1) - (1)].d)); }
     break;
 
   case 41:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 340 "Gmsh.y"
-    { ViewCoord.push_back((yyvsp[(3) - (3)].d)); ;}
+    { ViewCoord.push_back((yyvsp[(3) - (3)].d)); }
     break;
 
   case 42:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 345 "Gmsh.y"
-    { if(ViewValueList) ViewValueList->push_back((yyvsp[(1) - (1)].d)); ;}
+    { if(ViewValueList) ViewValueList->push_back((yyvsp[(1) - (1)].d)); }
     break;
 
   case 43:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 347 "Gmsh.y"
-    { if(ViewValueList) ViewValueList->push_back((yyvsp[(3) - (3)].d)); ;}
+    { if(ViewValueList) ViewValueList->push_back((yyvsp[(3) - (3)].d)); }
     break;
 
   case 44:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 352 "Gmsh.y"
     {
 #if defined(HAVE_POST)
@@ -4446,12 +4468,12 @@ yyreduce:
 #endif
       ViewCoord.clear();
       Free((yyvsp[(1) - (1)].c));
-    ;}
+    }
     break;
 
   case 45:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 456 "Gmsh.y"
     {
 #if defined(HAVE_POST)
@@ -4461,47 +4483,47 @@ yyreduce:
 	    ViewValueList->push_back(ViewCoord[3 * j + i]);
       }
 #endif
-    ;}
+    }
     break;
 
   case 46:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 466 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       if(ViewValueList) (*ViewNumList)++;
 #endif
-    ;}
+    }
     break;
 
   case 47:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 475 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       for(int i = 0; i < (int)strlen((yyvsp[(1) - (1)].c)) + 1; i++) ViewData->T2C.push_back((yyvsp[(1) - (1)].c)[i]);
 #endif
       Free((yyvsp[(1) - (1)].c));
-    ;}
+    }
     break;
 
   case 48:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 482 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       for(int i = 0; i < (int)strlen((yyvsp[(3) - (3)].c)) + 1; i++) ViewData->T2C.push_back((yyvsp[(3) - (3)].c)[i]);
 #endif
       Free((yyvsp[(3) - (3)].c));
-    ;}
+    }
     break;
 
   case 49:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 492 "Gmsh.y"
     {
 #if defined(HAVE_POST)
@@ -4510,47 +4532,47 @@ yyreduce:
       ViewData->T2D.push_back((yyvsp[(7) - (8)].d));
       ViewData->T2D.push_back(ViewData->T2C.size());
 #endif
-    ;}
+    }
     break;
 
   case 50:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 501 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       ViewData->NbT2++;
 #endif
-    ;}
+    }
     break;
 
   case 51:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 510 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       for(int i = 0; i < (int)strlen((yyvsp[(1) - (1)].c)) + 1; i++) ViewData->T3C.push_back((yyvsp[(1) - (1)].c)[i]);
 #endif
       Free((yyvsp[(1) - (1)].c));
-    ;}
+    }
     break;
 
   case 52:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 517 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       for(int i = 0; i < (int)strlen((yyvsp[(3) - (3)].c)) + 1; i++) ViewData->T3C.push_back((yyvsp[(3) - (3)].c)[i]);
 #endif
       Free((yyvsp[(3) - (3)].c));
-    ;}
+    }
     break;
 
   case 53:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 527 "Gmsh.y"
     {
 #if defined(HAVE_POST)
@@ -4558,23 +4580,23 @@ yyreduce:
       ViewData->T3D.push_back((yyvsp[(7) - (10)].d)); ViewData->T3D.push_back((yyvsp[(9) - (10)].d));
       ViewData->T3D.push_back(ViewData->T3C.size());
 #endif
-    ;}
+    }
     break;
 
   case 54:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 535 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       ViewData->NbT3++;
 #endif
-    ;}
+    }
     break;
 
   case 55:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 545 "Gmsh.y"
     {
 #if defined(HAVE_POST)
@@ -4590,12 +4612,12 @@ yyreduce:
       ViewData->setInterpolationMatrices(type, ListOfListOfDouble2Matrix((yyvsp[(3) - (8)].l)),
                                          ListOfListOfDouble2Matrix((yyvsp[(6) - (8)].l)));
 #endif
-    ;}
+    }
     break;
 
   case 56:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 564 "Gmsh.y"
     {
 #if defined(HAVE_POST)
@@ -4611,80 +4633,80 @@ yyreduce:
                                          ListOfListOfDouble2Matrix((yyvsp[(9) - (14)].l)),
                                          ListOfListOfDouble2Matrix((yyvsp[(12) - (14)].l)));
 #endif
-    ;}
+    }
     break;
 
   case 57:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 583 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       ViewValueList = &ViewData->Time;
 #endif
-    ;}
+    }
     break;
 
   case 58:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 589 "Gmsh.y"
     {
-    ;}
+    }
     break;
 
   case 59:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 596 "Gmsh.y"
-    { (yyval.i) = 0; ;}
+    { (yyval.i) = 0; }
     break;
 
   case 60:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 597 "Gmsh.y"
-    { (yyval.i) = 1; ;}
+    { (yyval.i) = 1; }
     break;
 
   case 61:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 598 "Gmsh.y"
-    { (yyval.i) = 2; ;}
+    { (yyval.i) = 2; }
     break;
 
   case 62:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 599 "Gmsh.y"
-    { (yyval.i) = 3; ;}
+    { (yyval.i) = 3; }
     break;
 
   case 63:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 600 "Gmsh.y"
-    { (yyval.i) = 4; ;}
+    { (yyval.i) = 4; }
     break;
 
   case 64:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 604 "Gmsh.y"
-    { (yyval.i) = 1; ;}
+    { (yyval.i) = 1; }
     break;
 
   case 65:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 605 "Gmsh.y"
-    { (yyval.i) = -1; ;}
+    { (yyval.i) = -1; }
     break;
 
   case 67:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 614 "Gmsh.y"
     {
       if(!gmsh_yysymbols.count((yyvsp[(1) - (4)].c)) && (yyvsp[(2) - (4)].i) && List_Nbr((yyvsp[(3) - (4)].l)) == 1){
@@ -4744,12 +4766,12 @@ yyreduce:
       }
       Free((yyvsp[(1) - (4)].c));
       List_Delete((yyvsp[(3) - (4)].l));
-    ;}
+    }
     break;
 
   case 68:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 677 "Gmsh.y"
     {
       gmsh_yysymbol &s(gmsh_yysymbols[(yyvsp[(1) - (6)].c)]);
@@ -4778,12 +4800,12 @@ yyreduce:
       }
       Free((yyvsp[(1) - (6)].c));
       List_Delete((yyvsp[(5) - (6)].l));
-    ;}
+    }
     break;
 
   case 69:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 707 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (7)].d);
@@ -4816,12 +4838,12 @@ yyreduce:
           yymsg(0, "Variable '%s' is not a list", (yyvsp[(1) - (7)].c));
       }
       Free((yyvsp[(1) - (7)].c));
-    ;}
+    }
     break;
 
   case 70:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 740 "Gmsh.y"
     {
       if(List_Nbr((yyvsp[(4) - (9)].l)) != List_Nbr((yyvsp[(8) - (9)].l))){
@@ -4867,12 +4889,12 @@ yyreduce:
       Free((yyvsp[(1) - (9)].c));
       List_Delete((yyvsp[(4) - (9)].l));
       List_Delete((yyvsp[(8) - (9)].l));
-    ;}
+    }
     break;
 
   case 71:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 786 "Gmsh.y"
     {
       if(!gmsh_yysymbols.count((yyvsp[(1) - (3)].c)))
@@ -4887,12 +4909,12 @@ yyreduce:
           yymsg(0, "Variable '%s' is a list", (yyvsp[(1) - (3)].c));
       }
       Free((yyvsp[(1) - (3)].c));
-    ;}
+    }
     break;
 
   case 72:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 801 "Gmsh.y"
     {
       if(!gmsh_yysymbols.count((yyvsp[(1) - (6)].c)))
@@ -4908,23 +4930,23 @@ yyreduce:
           yymsg(0, "Variable '%s' is not a list", (yyvsp[(1) - (6)].c));
       }
       Free((yyvsp[(1) - (6)].c));
-    ;}
+    }
     break;
 
   case 73:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 817 "Gmsh.y"
     {
       gmsh_yystringsymbols[(yyvsp[(1) - (4)].c)] = std::string((yyvsp[(3) - (4)].c));
       Free((yyvsp[(1) - (4)].c));
       Free((yyvsp[(3) - (4)].c));
-    ;}
+    }
     break;
 
   case 74:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 826 "Gmsh.y"
     {
       std::string tmp((yyvsp[(5) - (6)].c));
@@ -4935,7 +4957,7 @@ yyreduce:
 
   case 75:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 832 "Gmsh.y"
     {
       std::string tmp((yyvsp[(8) - (9)].c));
@@ -4946,7 +4968,7 @@ yyreduce:
 
   case 76:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 841 "Gmsh.y"
     {
       double d = 0.;
@@ -4964,12 +4986,12 @@ yyreduce:
 	NumberOption(GMSH_SET|GMSH_GUI, (yyvsp[(1) - (6)].c), 0, (yyvsp[(3) - (6)].c), d);
       }
       Free((yyvsp[(1) - (6)].c)); Free((yyvsp[(3) - (6)].c));
-    ;}
+    }
     break;
 
   case 77:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 859 "Gmsh.y"
     {
       double d = 0.;
@@ -4987,12 +5009,12 @@ yyreduce:
 	NumberOption(GMSH_SET|GMSH_GUI, (yyvsp[(1) - (9)].c), (int)(yyvsp[(3) - (9)].d), (yyvsp[(6) - (9)].c), d);
       }
       Free((yyvsp[(1) - (9)].c)); Free((yyvsp[(6) - (9)].c));
-    ;}
+    }
     break;
 
   case 78:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 877 "Gmsh.y"
     {
       double d = 0.;
@@ -5001,12 +5023,12 @@ yyreduce:
 	NumberOption(GMSH_SET|GMSH_GUI, (yyvsp[(1) - (5)].c), 0, (yyvsp[(3) - (5)].c), d);
       }
       Free((yyvsp[(1) - (5)].c)); Free((yyvsp[(3) - (5)].c));
-    ;}
+    }
     break;
 
   case 79:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 886 "Gmsh.y"
     {
       double d = 0.;
@@ -5015,32 +5037,32 @@ yyreduce:
 	NumberOption(GMSH_SET|GMSH_GUI, (yyvsp[(1) - (8)].c), (int)(yyvsp[(3) - (8)].d), (yyvsp[(6) - (8)].c), d);
       }
       Free((yyvsp[(1) - (8)].c)); Free((yyvsp[(6) - (8)].c));
-    ;}
+    }
     break;
 
   case 80:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 898 "Gmsh.y"
     {
       ColorOption(GMSH_SET|GMSH_GUI, (yyvsp[(1) - (8)].c), 0, (yyvsp[(5) - (8)].c), (yyvsp[(7) - (8)].u));
       Free((yyvsp[(1) - (8)].c)); Free((yyvsp[(5) - (8)].c));
-    ;}
+    }
     break;
 
   case 81:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 903 "Gmsh.y"
     {
       ColorOption(GMSH_SET|GMSH_GUI, (yyvsp[(1) - (11)].c), (int)(yyvsp[(3) - (11)].d), (yyvsp[(8) - (11)].c), (yyvsp[(10) - (11)].u));
       Free((yyvsp[(1) - (11)].c)); Free((yyvsp[(8) - (11)].c));
-    ;}
+    }
     break;
 
   case 82:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 911 "Gmsh.y"
     {
       GmshColorTable *ct = GetColorTable(0);
@@ -5060,12 +5082,12 @@ yyreduce:
       }
       Free((yyvsp[(1) - (6)].c));
       List_Delete((yyvsp[(5) - (6)].l));
-    ;}
+    }
     break;
 
   case 83:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 931 "Gmsh.y"
     {
       GmshColorTable *ct = GetColorTable((int)(yyvsp[(3) - (9)].d));
@@ -5085,12 +5107,12 @@ yyreduce:
       }
       Free((yyvsp[(1) - (9)].c));
       List_Delete((yyvsp[(8) - (9)].l));
-    ;}
+    }
     break;
 
   case 84:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 954 "Gmsh.y"
     {
 #if defined(HAVE_MESH)
@@ -5101,12 +5123,12 @@ yyreduce:
       else
 	yymsg(0, "Unknown command %s Field", (yyvsp[(1) - (5)].c));
 #endif
-    ;}
+    }
     break;
 
   case 85:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 965 "Gmsh.y"
     {
 #if defined(HAVE_MESH)
@@ -5114,12 +5136,12 @@ yyreduce:
 	yymsg(0, "Cannot create field %i of type '%s'", (int)(yyvsp[(3) - (7)].d), (yyvsp[(6) - (7)].c));
 #endif
       Free((yyvsp[(6) - (7)].c));
-    ;}
+    }
     break;
 
   case 86:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 973 "Gmsh.y"
     {
 #if defined(HAVE_MESH)
@@ -5141,12 +5163,12 @@ yyreduce:
 	yymsg(0, "No field with id %i", (int)(yyvsp[(3) - (9)].d));
 #endif
       Free((yyvsp[(6) - (9)].c));
-    ;}
+    }
     break;
 
   case 87:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 995 "Gmsh.y"
     {
 #if defined(HAVE_MESH)
@@ -5169,12 +5191,12 @@ yyreduce:
 #endif
       Free((yyvsp[(6) - (9)].c));
       Free((yyvsp[(8) - (9)].c));
-    ;}
+    }
     break;
 
   case 88:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1018 "Gmsh.y"
     {
 #if defined(HAVE_MESH)
@@ -5200,12 +5222,12 @@ yyreduce:
 #endif
       Free((yyvsp[(6) - (11)].c));
       List_Delete((yyvsp[(9) - (11)].l));
-    ;}
+    }
     break;
 
   case 89:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1044 "Gmsh.y"
     {
 #if defined(HAVE_MESH)
@@ -5223,12 +5245,12 @@ yyreduce:
 	yymsg(0, "No field with id %i", (int)(yyvsp[(3) - (7)].d));
 #endif
       Free((yyvsp[(6) - (7)].c));
-    ;}
+    }
     break;
 
   case 90:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1065 "Gmsh.y"
     {
 #if defined(HAVE_PLUGINS)
@@ -5240,12 +5262,12 @@ yyreduce:
       }
 #endif
       Free((yyvsp[(3) - (9)].c)); Free((yyvsp[(6) - (9)].c));
-    ;}
+    }
     break;
 
   case 91:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1077 "Gmsh.y"
     {
 #if defined(HAVE_PLUGINS)
@@ -5257,12 +5279,12 @@ yyreduce:
       }
 #endif
       Free((yyvsp[(3) - (9)].c)); Free((yyvsp[(6) - (9)].c)); Free((yyvsp[(8) - (9)].c));
-    ;}
+    }
     break;
 
   case 95:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1095 "Gmsh.y"
     {
       std::string key((yyvsp[(3) - (3)].c));
@@ -5273,12 +5295,12 @@ yyreduce:
         gmsh_yysymbols[key].value = val;
       }
       Free((yyvsp[(3) - (3)].c));
-    ;}
+    }
     break;
 
   case 96:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1106 "Gmsh.y"
     {
       std::string key((yyvsp[(3) - (5)].c));
@@ -5289,19 +5311,19 @@ yyreduce:
         gmsh_yysymbols[key].value = val;
       }
       Free((yyvsp[(3) - (5)].c));
-    ;}
+    }
     break;
 
   case 97:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1117 "Gmsh.y"
-    { floatOptions.clear(); charOptions.clear(); ;}
+    { floatOptions.clear(); charOptions.clear(); }
     break;
 
   case 98:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1119 "Gmsh.y"
     {
       std::string key((yyvsp[(3) - (9)].c));
@@ -5310,33 +5332,33 @@ yyreduce:
         Msg::ExchangeOnelabParameter(key, val, floatOptions, charOptions);
         gmsh_yysymbols[key].value = val;
       }
-    ;}
+    }
     break;
 
   case 99:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1131 "Gmsh.y"
     {
       (yyval.l) = List_Create(20,20,sizeof(doubleXstring));
       doubleXstring v = {(yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].c)};
       List_Add((yyval.l), &v);
-    ;}
+    }
     break;
 
   case 100:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1137 "Gmsh.y"
     {
       doubleXstring v = {(yyvsp[(3) - (5)].d), (yyvsp[(5) - (5)].c)};
       List_Add((yyval.l), &v);
-    ;}
+    }
     break;
 
   case 103:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1149 "Gmsh.y"
     {
       std::string key((yyvsp[(2) - (3)].c));
@@ -5347,12 +5369,12 @@ yyreduce:
       }
       Free((yyvsp[(2) - (3)].c));
       List_Delete((yyvsp[(3) - (3)].l));
-    ;}
+    }
     break;
 
   case 104:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1160 "Gmsh.y"
     {
       std::string key((yyvsp[(2) - (5)].c));
@@ -5366,12 +5388,12 @@ yyreduce:
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++)
         Free(((doubleXstring*)List_Pointer((yyvsp[(4) - (5)].l), i))->s);
       List_Delete((yyvsp[(4) - (5)].l));
-    ;}
+    }
     break;
 
   case 105:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1175 "Gmsh.y"
     {
       std::string key((yyvsp[(2) - (3)].c));
@@ -5379,42 +5401,42 @@ yyreduce:
       charOptions[key].push_back(val);
       Free((yyvsp[(2) - (3)].c));
       Free((yyvsp[(3) - (3)].c));
-    ;}
+    }
     break;
 
   case 106:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1188 "Gmsh.y"
     {
       (yyval.i) = (int)(yyvsp[(1) - (1)].d);
-    ;}
+    }
     break;
 
   case 107:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1192 "Gmsh.y"
     {
       (yyval.i) = GModel::current()->setPhysicalName
         (std::string((yyvsp[(1) - (1)].c)), curPhysDim,
          ++GModel::current()->getGEOInternals()->MaxPhysicalNum);
       Free((yyvsp[(1) - (1)].c));
-    ;}
+    }
     break;
 
   case 108:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1202 "Gmsh.y"
     {
       (yyval.l) = 0;
-    ;}
+    }
     break;
 
   case 109:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1206 "Gmsh.y"
     {
       (yyval.l) = List_Create(1, 1, sizeof(Vertex*));
@@ -5424,30 +5446,30 @@ yyreduce:
       else{
 	List_Add((yyval.l), &v);
       }
-    ;}
+    }
     break;
 
   case 110:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1218 "Gmsh.y"
     {
       for(int i = 0; i < 4; i++) (yyval.v)[i] = 0.;
-    ;}
+    }
     break;
 
   case 111:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1222 "Gmsh.y"
     {
       for(int i = 0; i < 4; i++) (yyval.v)[i] = (yyvsp[(2) - (2)].v)[i];
-    ;}
+    }
     break;
 
   case 112:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1232 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
@@ -5470,21 +5492,21 @@ yyreduce:
       }
       (yyval.s).Type = MSH_POINT;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 113:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1255 "Gmsh.y"
     {
       curPhysDim = 0;
-    ;}
+    }
     break;
 
   case 114:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1259 "Gmsh.y"
     {
       int num = (int)(yyvsp[(5) - (9)].i);
@@ -5500,12 +5522,12 @@ yyreduce:
       List_Delete((yyvsp[(8) - (9)].l));
       (yyval.s).Type = MSH_PHYSICAL_POINT;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 115:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1275 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (6)].l)); i++){
@@ -5524,12 +5546,12 @@ yyreduce:
       // dummy values
       (yyval.s).Type = 0;
       (yyval.s).Num = 0;
-    ;}
+    }
     break;
 
   case 116:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1297 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
@@ -5547,12 +5569,12 @@ yyreduce:
       List_Delete((yyvsp[(6) - (7)].l));
       (yyval.s).Type = MSH_SEGM_LINE;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 117:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1315 "Gmsh.y"
     {
       for (int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){
@@ -5573,12 +5595,12 @@ yyreduce:
 	  }
 	}
       }
-    ;}
+    }
     break;
 
   case 118:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1336 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
@@ -5596,12 +5618,12 @@ yyreduce:
       List_Delete((yyvsp[(6) - (7)].l));
       (yyval.s).Type = MSH_SEGM_SPLN;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 119:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1354 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (8)].d);
@@ -5631,12 +5653,12 @@ yyreduce:
       List_Delete((yyvsp[(6) - (8)].l));
       (yyval.s).Type = MSH_SEGM_CIRC;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 120:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1384 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (8)].d);
@@ -5666,12 +5688,12 @@ yyreduce:
       List_Delete((yyvsp[(6) - (8)].l));
       (yyval.s).Type = MSH_SEGM_ELLI;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 121:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1414 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
@@ -5689,12 +5711,12 @@ yyreduce:
       List_Delete((yyvsp[(6) - (7)].l));
       (yyval.s).Type = MSH_SEGM_BSPLN;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 122:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1432 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
@@ -5712,12 +5734,12 @@ yyreduce:
       List_Delete((yyvsp[(6) - (7)].l));
       (yyval.s).Type = MSH_SEGM_BEZIER;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 123:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1450 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (11)].d);
@@ -5743,12 +5765,12 @@ yyreduce:
       List_Delete((yyvsp[(8) - (11)].l));
       (yyval.s).Type = MSH_SEGM_NURBS;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 124:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1476 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (8)].d);
@@ -5766,12 +5788,12 @@ yyreduce:
       Free((yyvsp[(2) - (8)].c));
       (yyval.s).Type = MSH_SEGM_LOOP;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 125:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1494 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (8)].d);
@@ -5789,21 +5811,21 @@ yyreduce:
       List_Delete((yyvsp[(7) - (8)].l));
       (yyval.s).Type = MSH_SEGM_COMPOUND;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 126:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1512 "Gmsh.y"
     {
       curPhysDim = 1;
-    ;}
+    }
     break;
 
   case 127:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1516 "Gmsh.y"
     {
       int num = (int)(yyvsp[(5) - (9)].i);
@@ -5819,12 +5841,12 @@ yyreduce:
       List_Delete((yyvsp[(8) - (9)].l));
       (yyval.s).Type = MSH_PHYSICAL_LINE;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 128:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1535 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (8)].d);
@@ -5842,12 +5864,12 @@ yyreduce:
       List_Delete((yyvsp[(7) - (8)].l));
       (yyval.s).Type = MSH_SURF_PLAN;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 129:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1553 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (9)].d), type = 0;
@@ -5886,46 +5908,46 @@ yyreduce:
       List_Delete((yyvsp[(7) - (9)].l));
       (yyval.s).Type = type;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 130:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1592 "Gmsh.y"
     {
       myGmshSurface = 0;
       (yyval.s).Type = 0;
       (yyval.s).Num = 0;
-    ;}
+    }
     break;
 
   case 131:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1598 "Gmsh.y"
     {
       myGmshSurface = gmshSurface::getSurface((int)(yyvsp[(3) - (4)].d));
       (yyval.s).Type = 0;
       (yyval.s).Num = 0;
-    ;}
+    }
     break;
 
   case 132:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1604 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (10)].d);
       myGmshSurface = gmshParametricSurface::NewParametricSurface(num, (yyvsp[(7) - (10)].c), (yyvsp[(8) - (10)].c), (yyvsp[(9) - (10)].c));
       (yyval.s).Type = 0;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 133:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1611 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
@@ -5950,12 +5972,12 @@ yyreduce:
       }
       (yyval.s).Type = 0;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 134:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1636 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
@@ -5980,12 +6002,12 @@ yyreduce:
       }
       (yyval.s).Type = 0;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 135:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1661 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (8)].d);
@@ -6002,12 +6024,12 @@ yyreduce:
       Free((yyvsp[(2) - (8)].c));
       (yyval.s).Type = MSH_SURF_LOOP;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 136:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1678 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (8)].d);
@@ -6024,12 +6046,12 @@ yyreduce:
       List_Delete((yyvsp[(7) - (8)].l));
       (yyval.s).Type = MSH_SURF_COMPOUND;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 137:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1696 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (12)].d);
@@ -6059,21 +6081,21 @@ yyreduce:
       Free((yyvsp[(8) - (12)].c));
       (yyval.s).Type = MSH_SURF_COMPOUND;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 138:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1726 "Gmsh.y"
     {
       curPhysDim = 2;
-    ;}
+    }
     break;
 
   case 139:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1730 "Gmsh.y"
     {
       int num = (int)(yyvsp[(5) - (9)].i);
@@ -6089,12 +6111,12 @@ yyreduce:
       List_Delete((yyvsp[(8) - (9)].l));
       (yyval.s).Type = MSH_PHYSICAL_SURFACE;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 140:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1750 "Gmsh.y"
     {
       yymsg(0, "'Complex Volume' command is deprecated: use 'Volume' instead");
@@ -6112,12 +6134,12 @@ yyreduce:
       List_Delete((yyvsp[(7) - (8)].l));
       (yyval.s).Type = MSH_VOLUME;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 141:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1768 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
@@ -6134,12 +6156,12 @@ yyreduce:
       List_Delete((yyvsp[(6) - (7)].l));
       (yyval.s).Type = MSH_VOLUME;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 142:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1785 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (8)].d);
@@ -6155,21 +6177,21 @@ yyreduce:
       List_Delete((yyvsp[(7) - (8)].l));
       (yyval.s).Type = MSH_VOLUME_COMPOUND;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 143:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1801 "Gmsh.y"
     {
       curPhysDim = 3;
-    ;}
+    }
     break;
 
   case 144:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1805 "Gmsh.y"
     {
       int num = (int)(yyvsp[(5) - (9)].i);
@@ -6185,62 +6207,62 @@ yyreduce:
       List_Delete((yyvsp[(8) - (9)].l));
       (yyval.s).Type = MSH_PHYSICAL_VOLUME;
       (yyval.s).Num = num;
-    ;}
+    }
     break;
 
   case 145:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1827 "Gmsh.y"
     {
       TranslateShapes((yyvsp[(2) - (5)].v)[0], (yyvsp[(2) - (5)].v)[1], (yyvsp[(2) - (5)].v)[2], (yyvsp[(4) - (5)].l));
       (yyval.l) = (yyvsp[(4) - (5)].l);
-    ;}
+    }
     break;
 
   case 146:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1832 "Gmsh.y"
     {
       RotateShapes((yyvsp[(3) - (11)].v)[0], (yyvsp[(3) - (11)].v)[1], (yyvsp[(3) - (11)].v)[2], (yyvsp[(5) - (11)].v)[0], (yyvsp[(5) - (11)].v)[1], (yyvsp[(5) - (11)].v)[2], (yyvsp[(7) - (11)].d), (yyvsp[(10) - (11)].l));
       (yyval.l) = (yyvsp[(10) - (11)].l);
-    ;}
+    }
     break;
 
   case 147:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1837 "Gmsh.y"
     {
       SymmetryShapes((yyvsp[(2) - (5)].v)[0], (yyvsp[(2) - (5)].v)[1], (yyvsp[(2) - (5)].v)[2], (yyvsp[(2) - (5)].v)[3], (yyvsp[(4) - (5)].l));
       (yyval.l) = (yyvsp[(4) - (5)].l);
-    ;}
+    }
     break;
 
   case 148:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1842 "Gmsh.y"
     {
       DilatShapes((yyvsp[(3) - (9)].v)[0], (yyvsp[(3) - (9)].v)[1], (yyvsp[(3) - (9)].v)[2], (yyvsp[(5) - (9)].d), (yyvsp[(5) - (9)].d), (yyvsp[(5) - (9)].d), (yyvsp[(8) - (9)].l));
       (yyval.l) = (yyvsp[(8) - (9)].l);
-    ;}
+    }
     break;
 
   case 149:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1847 "Gmsh.y"
     {
       DilatShapes((yyvsp[(3) - (9)].v)[0], (yyvsp[(3) - (9)].v)[1], (yyvsp[(3) - (9)].v)[2], (yyvsp[(5) - (9)].v)[0], (yyvsp[(5) - (9)].v)[1], (yyvsp[(5) - (9)].v)[2], (yyvsp[(8) - (9)].l));
       (yyval.l) = (yyvsp[(8) - (9)].l);
-    ;}
+    }
     break;
 
   case 150:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1852 "Gmsh.y"
     {
       (yyval.l) = List_Create(3, 3, sizeof(Shape));
@@ -6263,23 +6285,23 @@ yyreduce:
       }
       Free((yyvsp[(1) - (4)].c));
       List_Delete((yyvsp[(3) - (4)].l));
-    ;}
+    }
     break;
 
   case 151:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1875 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       IntersectCurvesWithSurface((yyvsp[(4) - (9)].l), (int)(yyvsp[(8) - (9)].d), (yyval.l));
       List_Delete((yyvsp[(4) - (9)].l));
-    ;}
+    }
     break;
 
   case 152:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1881 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape*));
@@ -6287,44 +6309,44 @@ yyreduce:
       List_Delete((yyvsp[(7) - (9)].l));
       SplitCurve((int)(yyvsp[(4) - (9)].d), tmp, (yyval.l));
       List_Delete(tmp);
-    ;}
+    }
     break;
 
   case 153:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1891 "Gmsh.y"
-    { (yyval.l) = (yyvsp[(1) - (1)].l); ;}
+    { (yyval.l) = (yyvsp[(1) - (1)].l); }
     break;
 
   case 154:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1892 "Gmsh.y"
-    { (yyval.l) = (yyvsp[(1) - (1)].l); ;}
+    { (yyval.l) = (yyvsp[(1) - (1)].l); }
     break;
 
   case 155:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1897 "Gmsh.y"
     {
       (yyval.l) = List_Create(3, 3, sizeof(Shape));
-    ;}
+    }
     break;
 
   case 156:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1901 "Gmsh.y"
     {
       List_Add((yyval.l), &(yyvsp[(2) - (2)].s));
-    ;}
+    }
     break;
 
   case 157:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1905 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (6)].l)); i++){
@@ -6347,12 +6369,12 @@ yyreduce:
 	    yymsg(1, "Unknown point %d", TheShape.Num);
 	}
       }
-    ;}
+    }
     break;
 
   case 158:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1928 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (6)].l)); i++){
@@ -6375,12 +6397,12 @@ yyreduce:
 	    yymsg(1, "Unknown curve %d", TheShape.Num);
 	}
       }
-    ;}
+    }
     break;
 
   case 159:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1951 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (6)].l)); i++){
@@ -6403,12 +6425,12 @@ yyreduce:
 	    yymsg(1, "Unknown surface %d", TheShape.Num);
 	}
       }
-    ;}
+    }
     break;
 
   case 160:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 1974 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (6)].l)); i++){
@@ -6431,12 +6453,12 @@ yyreduce:
 	    yymsg(1, "Unknown volume %d", TheShape.Num);
 	}
       }
-    ;}
+    }
     break;
 
   case 161:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2002 "Gmsh.y"
     {
 #if defined(HAVE_DINTEGRATION)
@@ -6457,12 +6479,12 @@ yyreduce:
       else
         yymsg(0, "Wrong levelset definition (%d)", (yyvsp[(4) - (8)].d));
 #endif
-    ;}
+    }
     break;
 
   case 162:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2023 "Gmsh.y"
     {
 #if defined(HAVE_DINTEGRATION)
@@ -6485,12 +6507,12 @@ yyreduce:
 	 Tree_Add(GModel::current()->getGEOInternals()->LevelSets, &l);
       }
 #endif
-    ;}
+    }
     break;
 
   case 163:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2047 "Gmsh.y"
     {
 #if defined(HAVE_DINTEGRATION)
@@ -6510,12 +6532,12 @@ yyreduce:
       else
         yymsg(0, "Wrong levelset definition (%d)", (yyvsp[(4) - (14)].d));
 #endif
-    ;}
+    }
     break;
 
   case 164:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2068 "Gmsh.y"
     {
 #if defined(HAVE_DINTEGRATION)
@@ -6536,12 +6558,12 @@ yyreduce:
       else
         yymsg(0, "Wrong levelset definition (%d)", (yyvsp[(4) - (16)].d));
 #endif
-    ;}
+    }
     break;
 
   case 165:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2089 "Gmsh.y"
     {
 #if defined(HAVE_DINTEGRATION)
@@ -6561,12 +6583,12 @@ yyreduce:
       else
         yymsg(0, "Wrong levelset definition (%d)", (yyvsp[(4) - (12)].d));
 #endif
-    ;}
+    }
     break;
 
   case 166:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2109 "Gmsh.y"
     {
 #if defined(HAVE_DINTEGRATION)
@@ -6678,12 +6700,12 @@ yyreduce:
         yymsg(0, "Wrong levelset definition (%d)", (yyvsp[(4) - (8)].d));
       Free((yyvsp[(2) - (8)].c));
 #endif
-    ;}
+    }
     break;
 
   case 167:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2221 "Gmsh.y"
     {
 #if defined(HAVE_DINTEGRATION)
@@ -6702,12 +6724,12 @@ yyreduce:
         yymsg(0, "Wrong levelset definition");
       Free((yyvsp[(2) - (8)].c)); Free((yyvsp[(7) - (8)].c));
 #endif
-    ;}
+    }
     break;
 
   case 168:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2240 "Gmsh.y"
     {
 #if defined(HAVE_DINTEGRATION)
@@ -6745,12 +6767,12 @@ yyreduce:
         yymsg(0, "Wrong levelset definition");
       Free((yyvsp[(2) - (6)].c));
 #endif
-    ;}
+    }
     break;
 
   case 169:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2279 "Gmsh.y"
     {
 #if defined(HAVE_DINTEGRATION)
@@ -6853,12 +6875,12 @@ yyreduce:
         yymsg(0, "Wrong levelset definition (%d)", (yyvsp[(4) - (14)].d));
       Free((yyvsp[(2) - (14)].c));
 #endif
-    ;}
+    }
     break;
 
   case 170:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2387 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){
@@ -6867,23 +6889,23 @@ yyreduce:
 	DeleteShape(TheShape.Type, TheShape.Num);
       }
       List_Delete((yyvsp[(3) - (4)].l));
-    ;}
+    }
     break;
 
   case 171:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2396 "Gmsh.y"
     {
 #if defined(HAVE_MESH)
       GModel::current()->getFields()->deleteField((int)(yyvsp[(4) - (6)].d));
 #endif
-    ;}
+    }
     break;
 
   case 172:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2402 "Gmsh.y"
     {
 #if defined(HAVE_POST)
@@ -6898,12 +6920,12 @@ yyreduce:
 	yymsg(0, "Unknown command 'Delete %s'", (yyvsp[(2) - (6)].c));
 #endif
       Free((yyvsp[(2) - (6)].c));
-    ;}
+    }
     break;
 
   case 173:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2417 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (3)].c), "Meshes") || !strcmp((yyvsp[(2) - (3)].c), "All")){
@@ -6931,12 +6953,12 @@ yyreduce:
 	  yymsg(0, "Unknown object or expression to delete '%s'", (yyvsp[(2) - (3)].c));
       }
       Free((yyvsp[(2) - (3)].c));
-    ;}
+    }
     break;
 
   case 174:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2445 "Gmsh.y"
     {
 #if defined(HAVE_POST)
@@ -6948,12 +6970,12 @@ yyreduce:
 	yymsg(0, "Unknown command 'Delete %s %s'", (yyvsp[(2) - (4)].c), (yyvsp[(3) - (4)].c));
 #endif
       Free((yyvsp[(2) - (4)].c)); Free((yyvsp[(3) - (4)].c));
-    ;}
+    }
     break;
 
   case 175:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2462 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){
@@ -6962,34 +6984,34 @@ yyreduce:
 	ColorShape(TheShape.Type, TheShape.Num, (yyvsp[(2) - (5)].u));
       }
       List_Delete((yyvsp[(4) - (5)].l));
-    ;}
+    }
     break;
 
   case 176:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2476 "Gmsh.y"
     {
       for(int i = 0; i < 4; i++)
 	VisibilityShape((yyvsp[(2) - (3)].c), i, 1);
       Free((yyvsp[(2) - (3)].c));
-    ;}
+    }
     break;
 
   case 177:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2482 "Gmsh.y"
     {
       for(int i = 0; i < 4; i++)
 	VisibilityShape((yyvsp[(2) - (3)].c), i, 0);
       Free((yyvsp[(2) - (3)].c));
-    ;}
+    }
     break;
 
   case 178:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2488 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){
@@ -6998,12 +7020,12 @@ yyreduce:
 	VisibilityShape(TheShape.Type, TheShape.Num, 1);
       }
       List_Delete((yyvsp[(3) - (4)].l));
-    ;}
+    }
     break;
 
   case 179:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2497 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){
@@ -7012,12 +7034,12 @@ yyreduce:
 	VisibilityShape(TheShape.Type, TheShape.Num, 0);
       }
       List_Delete((yyvsp[(3) - (4)].l));
-    ;}
+    }
     break;
 
   case 180:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2511 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (3)].c), "Include")){
@@ -7062,12 +7084,12 @@ yyreduce:
       else
 	yymsg(0, "Unknown command '%s'", (yyvsp[(1) - (3)].c));
       Free((yyvsp[(1) - (3)].c)); Free((yyvsp[(2) - (3)].c));
-    ;}
+    }
     break;
 
   case 181:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2556 "Gmsh.y"
     {
 #if defined(HAVE_POST)
@@ -7084,12 +7106,12 @@ yyreduce:
 	yymsg(0, "Unknown command '%s'", (yyvsp[(1) - (7)].c));
 #endif
       Free((yyvsp[(1) - (7)].c)); Free((yyvsp[(2) - (7)].c)); Free((yyvsp[(6) - (7)].c));
-    ;}
+    }
     break;
 
   case 182:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2573 "Gmsh.y"
     {
 #if defined(HAVE_POST) && defined(HAVE_MESH)
@@ -7104,12 +7126,12 @@ yyreduce:
 	yymsg(0, "Unknown command '%s'", (yyvsp[(1) - (7)].c));
 #endif
       Free((yyvsp[(1) - (7)].c)); Free((yyvsp[(2) - (7)].c)); Free((yyvsp[(3) - (7)].c));
-    ;}
+    }
     break;
 
   case 183:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2588 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (3)].c), "Sleep")){
@@ -7128,12 +7150,12 @@ yyreduce:
       else
 	yymsg(0, "Unknown command '%s'", (yyvsp[(1) - (3)].c));
       Free((yyvsp[(1) - (3)].c));
-    ;}
+    }
     break;
 
   case 184:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2607 "Gmsh.y"
     {
 #if defined(HAVE_PLUGINS)
@@ -7145,12 +7167,12 @@ yyreduce:
        }
 #endif
        Free((yyvsp[(3) - (7)].c)); Free((yyvsp[(6) - (7)].c));
-     ;}
+     }
     break;
 
   case 185:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2619 "Gmsh.y"
     {
 #if defined(HAVE_POST)
@@ -7174,94 +7196,94 @@ yyreduce:
 	yymsg(0, "Unknown 'Combine' command");
 #endif
       Free((yyvsp[(2) - (3)].c));
-    ;}
+    }
     break;
 
   case 186:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2643 "Gmsh.y"
     {
       gmsh_yyerrorstate = 999; // this will be checked when yyparse returns
       YYABORT;
-    ;}
+    }
     break;
 
   case 187:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2648 "Gmsh.y"
     {
       // FIXME: this is a hack to force a transfer from the old DB to
       // the new DB. This will become unnecessary if/when we fill the
       // GModel directly during parsing.
       GModel::current()->importGEOInternals();
-    ;}
+    }
     break;
 
   case 188:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2655 "Gmsh.y"
     {
       CTX::instance()->forcedBBox = 0;
       GModel::current()->importGEOInternals();
       SetBoundingBox();
-    ;}
+    }
     break;
 
   case 189:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2661 "Gmsh.y"
     {
       CTX::instance()->forcedBBox = 1;
       SetBoundingBox((yyvsp[(3) - (15)].d), (yyvsp[(5) - (15)].d), (yyvsp[(7) - (15)].d), (yyvsp[(9) - (15)].d), (yyvsp[(11) - (15)].d), (yyvsp[(13) - (15)].d));
-    ;}
+    }
     break;
 
   case 190:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2666 "Gmsh.y"
     {
 #if defined(HAVE_OPENGL)
       drawContext::global()->draw();
 #endif
-    ;}
+    }
     break;
 
   case 191:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2672 "Gmsh.y"
     {
       GModel::current()->createTopologyFromMesh();
-    ;}
+    }
     break;
 
   case 192:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2676 "Gmsh.y"
     {
       GModel::current()->createTopologyFromMesh(1);
-    ;}
+    }
     break;
 
   case 193:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2680 "Gmsh.y"
     {
       GModel::current()->importGEOInternals();
       GModel::current()->refineMesh(CTX::instance()->mesh.secondOrderLinear);
-    ;}
+    }
     break;
 
   case 194:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2690 "Gmsh.y"
     {
       LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(3) - (6)].d);
@@ -7278,12 +7300,12 @@ yyreduce:
 	yymsg(0, "Reached maximum number of imbricated loops");
 	ImbricatedLoop = MAX_RECUR_LOOPS - 1;
       }
-    ;}
+    }
     break;
 
   case 195:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2707 "Gmsh.y"
     {
       LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(3) - (8)].d);
@@ -7300,12 +7322,12 @@ yyreduce:
 	yymsg(0, "Reached maximum number of imbricated loops");
 	ImbricatedLoop = MAX_RECUR_LOOPS - 1;
       }
-    ;}
+    }
     break;
 
   case 196:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2724 "Gmsh.y"
     {
       LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(5) - (8)].d);
@@ -7326,12 +7348,12 @@ yyreduce:
 	yymsg(0, "Reached maximum number of imbricated loops");
 	ImbricatedLoop = MAX_RECUR_LOOPS - 1;
       }
-    ;}
+    }
     break;
 
   case 197:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2745 "Gmsh.y"
     {
       LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(5) - (10)].d);
@@ -7352,12 +7374,12 @@ yyreduce:
 	yymsg(0, "Reached maximum number of imbricated loops");
 	ImbricatedLoop = MAX_RECUR_LOOPS - 1;
       }
-    ;}
+    }
     break;
 
   case 198:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2766 "Gmsh.y"
     {
       if(ImbricatedLoop <= 0){
@@ -7392,12 +7414,12 @@ yyreduce:
 	else
 	  ImbricatedLoop--;
       }
-    ;}
+    }
     break;
 
   case 199:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2801 "Gmsh.y"
     {
       if(!FunctionManager::Instance()->createFunction
@@ -7405,52 +7427,52 @@ yyreduce:
 	yymsg(0, "Redefinition of function %s", (yyvsp[(2) - (2)].c));
       skip_until(NULL, "Return");
       //FIXME: wee leak $2
-    ;}
+    }
     break;
 
   case 200:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2809 "Gmsh.y"
     {
       if(!FunctionManager::Instance()->leaveFunction
          (&gmsh_yyin, gmsh_yyname, gmsh_yylineno))
 	yymsg(0, "Error while exiting function");
-    ;}
+    }
     break;
 
   case 201:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2815 "Gmsh.y"
     {
       if(!FunctionManager::Instance()->enterFunction
          ((yyvsp[(2) - (3)].c), &gmsh_yyin, gmsh_yyname, gmsh_yylineno))
 	yymsg(0, "Unknown function %s", (yyvsp[(2) - (3)].c));
       //FIXME: wee leak $2
-    ;}
+    }
     break;
 
   case 202:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2822 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (4)].d)) skip_until("If", "EndIf");
-    ;}
+    }
     break;
 
   case 203:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2826 "Gmsh.y"
     {
-    ;}
+    }
     break;
 
   case 204:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2835 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
@@ -7458,12 +7480,12 @@ yyreduce:
 		    (yyvsp[(2) - (5)].v)[0], (yyvsp[(2) - (5)].v)[1], (yyvsp[(2) - (5)].v)[2], 0., 0., 0., 0., 0., 0., 0.,
 		    NULL, (yyval.l));
       List_Delete((yyvsp[(4) - (5)].l));
-    ;}
+    }
     break;
 
   case 205:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2843 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
@@ -7471,12 +7493,12 @@ yyreduce:
 		    0., 0., 0., (yyvsp[(3) - (11)].v)[0], (yyvsp[(3) - (11)].v)[1], (yyvsp[(3) - (11)].v)[2], (yyvsp[(5) - (11)].v)[0], (yyvsp[(5) - (11)].v)[1], (yyvsp[(5) - (11)].v)[2], (yyvsp[(7) - (11)].d),
 		    NULL, (yyval.l));
       List_Delete((yyvsp[(10) - (11)].l));
-    ;}
+    }
     break;
 
   case 206:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2851 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
@@ -7484,22 +7506,22 @@ yyreduce:
 		    (yyvsp[(3) - (13)].v)[0], (yyvsp[(3) - (13)].v)[1], (yyvsp[(3) - (13)].v)[2], (yyvsp[(5) - (13)].v)[0], (yyvsp[(5) - (13)].v)[1], (yyvsp[(5) - (13)].v)[2], (yyvsp[(7) - (13)].v)[0], (yyvsp[(7) - (13)].v)[1], (yyvsp[(7) - (13)].v)[2], (yyvsp[(9) - (13)].d),
 		    NULL, (yyval.l));
       List_Delete((yyvsp[(12) - (13)].l));
-    ;}
+    }
     break;
 
   case 207:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2859 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
-    ;}
+    }
     break;
 
   case 208:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2864 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
@@ -7507,22 +7529,22 @@ yyreduce:
 		    (yyvsp[(2) - (7)].v)[0], (yyvsp[(2) - (7)].v)[1], (yyvsp[(2) - (7)].v)[2], 0., 0., 0., 0., 0., 0., 0.,
 		    &extr, (yyval.l));
       List_Delete((yyvsp[(4) - (7)].l));
-    ;}
+    }
     break;
 
   case 209:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2872 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
-    ;}
+    }
     break;
 
   case 210:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2877 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
@@ -7530,22 +7552,22 @@ yyreduce:
 		    0., 0., 0., (yyvsp[(3) - (13)].v)[0], (yyvsp[(3) - (13)].v)[1], (yyvsp[(3) - (13)].v)[2], (yyvsp[(5) - (13)].v)[0], (yyvsp[(5) - (13)].v)[1], (yyvsp[(5) - (13)].v)[2], (yyvsp[(7) - (13)].d),
 		    &extr, (yyval.l));
       List_Delete((yyvsp[(10) - (13)].l));
-    ;}
+    }
     break;
 
   case 211:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2885 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
-    ;}
+    }
     break;
 
   case 212:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2890 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
@@ -7553,356 +7575,356 @@ yyreduce:
 		    (yyvsp[(3) - (15)].v)[0], (yyvsp[(3) - (15)].v)[1], (yyvsp[(3) - (15)].v)[2], (yyvsp[(5) - (15)].v)[0], (yyvsp[(5) - (15)].v)[1], (yyvsp[(5) - (15)].v)[2], (yyvsp[(7) - (15)].v)[0], (yyvsp[(7) - (15)].v)[1], (yyvsp[(7) - (15)].v)[2], (yyvsp[(9) - (15)].d),
 		    &extr, (yyval.l));
       List_Delete((yyvsp[(12) - (15)].l));
-    ;}
+    }
     break;
 
   case 213:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2898 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
-    ;}
+    }
     break;
 
   case 214:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2903 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShapes(BOUNDARY_LAYER, (yyvsp[(3) - (6)].l), 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
 		    &extr, (yyval.l));
       List_Delete((yyvsp[(3) - (6)].l));
-    ;}
+    }
     break;
 
   case 215:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2911 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE, MSH_POINT, (int)(yyvsp[(4) - (8)].d),
 		   (yyvsp[(6) - (8)].v)[0], (yyvsp[(6) - (8)].v)[1], (yyvsp[(6) - (8)].v)[2], 0., 0., 0., 0., 0., 0., 0.,
 		   NULL, (yyval.l));
-    ;}
+    }
     break;
 
   case 216:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2918 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (8)].d),
 		   (yyvsp[(6) - (8)].v)[0], (yyvsp[(6) - (8)].v)[1], (yyvsp[(6) - (8)].v)[2], 0., 0., 0., 0., 0., 0., 0.,
 		   NULL, (yyval.l));
-    ;}
+    }
     break;
 
   case 217:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2925 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (8)].d),
 		   (yyvsp[(6) - (8)].v)[0], (yyvsp[(6) - (8)].v)[1], (yyvsp[(6) - (8)].v)[2], 0., 0., 0., 0., 0., 0., 0.,
 		   NULL, (yyval.l));
-    ;}
+    }
     break;
 
   case 218:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2932 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(ROTATE, MSH_POINT, (int)(yyvsp[(4) - (12)].d),
 		   0., 0., 0., (yyvsp[(6) - (12)].v)[0], (yyvsp[(6) - (12)].v)[1], (yyvsp[(6) - (12)].v)[2], (yyvsp[(8) - (12)].v)[0], (yyvsp[(8) - (12)].v)[1], (yyvsp[(8) - (12)].v)[2], (yyvsp[(10) - (12)].d),
 		   NULL, (yyval.l));
-    ;}
+    }
     break;
 
   case 219:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2939 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(ROTATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (12)].d),
 		   0., 0., 0., (yyvsp[(6) - (12)].v)[0], (yyvsp[(6) - (12)].v)[1], (yyvsp[(6) - (12)].v)[2], (yyvsp[(8) - (12)].v)[0], (yyvsp[(8) - (12)].v)[1], (yyvsp[(8) - (12)].v)[2], (yyvsp[(10) - (12)].d),
 		   NULL, (yyval.l));
-    ;}
+    }
     break;
 
   case 220:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2946 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(ROTATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (12)].d),
 		   0., 0., 0., (yyvsp[(6) - (12)].v)[0], (yyvsp[(6) - (12)].v)[1], (yyvsp[(6) - (12)].v)[2], (yyvsp[(8) - (12)].v)[0], (yyvsp[(8) - (12)].v)[1], (yyvsp[(8) - (12)].v)[2], (yyvsp[(10) - (12)].d),
 		   NULL, (yyval.l));
-    ;}
+    }
     break;
 
   case 221:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2953 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE_ROTATE, MSH_POINT, (int)(yyvsp[(4) - (14)].d),
 		   (yyvsp[(6) - (14)].v)[0], (yyvsp[(6) - (14)].v)[1], (yyvsp[(6) - (14)].v)[2], (yyvsp[(8) - (14)].v)[0], (yyvsp[(8) - (14)].v)[1], (yyvsp[(8) - (14)].v)[2], (yyvsp[(10) - (14)].v)[0], (yyvsp[(10) - (14)].v)[1], (yyvsp[(10) - (14)].v)[2], (yyvsp[(12) - (14)].d),
 		   NULL, (yyval.l));
-    ;}
+    }
     break;
 
   case 222:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2960 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE_ROTATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (14)].d),
 		   (yyvsp[(6) - (14)].v)[0], (yyvsp[(6) - (14)].v)[1], (yyvsp[(6) - (14)].v)[2], (yyvsp[(8) - (14)].v)[0], (yyvsp[(8) - (14)].v)[1], (yyvsp[(8) - (14)].v)[2], (yyvsp[(10) - (14)].v)[0], (yyvsp[(10) - (14)].v)[1], (yyvsp[(10) - (14)].v)[2], (yyvsp[(12) - (14)].d),
 		   NULL, (yyval.l));
-    ;}
+    }
     break;
 
   case 223:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2967 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE_ROTATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (14)].d),
 		   (yyvsp[(6) - (14)].v)[0], (yyvsp[(6) - (14)].v)[1], (yyvsp[(6) - (14)].v)[2], (yyvsp[(8) - (14)].v)[0], (yyvsp[(8) - (14)].v)[1], (yyvsp[(8) - (14)].v)[2], (yyvsp[(10) - (14)].v)[0], (yyvsp[(10) - (14)].v)[1], (yyvsp[(10) - (14)].v)[2], (yyvsp[(12) - (14)].d),
 		   NULL, (yyval.l));
-    ;}
+    }
     break;
 
   case 224:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2974 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
-    ;}
+    }
     break;
 
   case 225:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2979 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE, MSH_POINT, (int)(yyvsp[(4) - (12)].d),
 		   (yyvsp[(6) - (12)].v)[0], (yyvsp[(6) - (12)].v)[1], (yyvsp[(6) - (12)].v)[2], 0., 0., 0., 0., 0., 0., 0.,
 		   &extr, (yyval.l));
-    ;}
+    }
     break;
 
   case 226:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2986 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
-    ;}
+    }
     break;
 
   case 227:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2991 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (12)].d),
 		   (yyvsp[(6) - (12)].v)[0], (yyvsp[(6) - (12)].v)[1], (yyvsp[(6) - (12)].v)[2], 0., 0., 0., 0., 0., 0., 0.,
 		   &extr, (yyval.l));
-    ;}
+    }
     break;
 
   case 228:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 2998 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
-    ;}
+    }
     break;
 
   case 229:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3003 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (12)].d),
 		   (yyvsp[(6) - (12)].v)[0], (yyvsp[(6) - (12)].v)[1], (yyvsp[(6) - (12)].v)[2], 0., 0., 0., 0., 0., 0., 0.,
 		   &extr, (yyval.l));
-    ;}
+    }
     break;
 
   case 230:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3010 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
-    ;}
+    }
     break;
 
   case 231:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3015 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(ROTATE, MSH_POINT, (int)(yyvsp[(4) - (16)].d),
 		   0., 0., 0., (yyvsp[(6) - (16)].v)[0], (yyvsp[(6) - (16)].v)[1], (yyvsp[(6) - (16)].v)[2], (yyvsp[(8) - (16)].v)[0], (yyvsp[(8) - (16)].v)[1], (yyvsp[(8) - (16)].v)[2], (yyvsp[(10) - (16)].d),
 		   &extr, (yyval.l));
-    ;}
+    }
     break;
 
   case 232:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3022 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
-    ;}
+    }
     break;
 
   case 233:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3027 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(ROTATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (16)].d),
 		   0., 0., 0., (yyvsp[(6) - (16)].v)[0], (yyvsp[(6) - (16)].v)[1], (yyvsp[(6) - (16)].v)[2], (yyvsp[(8) - (16)].v)[0], (yyvsp[(8) - (16)].v)[1], (yyvsp[(8) - (16)].v)[2], (yyvsp[(10) - (16)].d),
 		   &extr, (yyval.l));
-    ;}
+    }
     break;
 
   case 234:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3034 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
-    ;}
+    }
     break;
 
   case 235:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3039 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(ROTATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (16)].d),
 		   0., 0., 0., (yyvsp[(6) - (16)].v)[0], (yyvsp[(6) - (16)].v)[1], (yyvsp[(6) - (16)].v)[2], (yyvsp[(8) - (16)].v)[0], (yyvsp[(8) - (16)].v)[1], (yyvsp[(8) - (16)].v)[2], (yyvsp[(10) - (16)].d),
 		   &extr, (yyval.l));
-    ;}
+    }
     break;
 
   case 236:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3046 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
-    ;}
+    }
     break;
 
   case 237:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3051 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE_ROTATE, MSH_POINT, (int)(yyvsp[(4) - (18)].d),
 		   (yyvsp[(6) - (18)].v)[0], (yyvsp[(6) - (18)].v)[1], (yyvsp[(6) - (18)].v)[2], (yyvsp[(8) - (18)].v)[0], (yyvsp[(8) - (18)].v)[1], (yyvsp[(8) - (18)].v)[2], (yyvsp[(10) - (18)].v)[0], (yyvsp[(10) - (18)].v)[1], (yyvsp[(10) - (18)].v)[2], (yyvsp[(12) - (18)].d),
 		   &extr, (yyval.l));
-    ;}
+    }
     break;
 
   case 238:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3058 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
-    ;}
+    }
     break;
 
   case 239:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3063 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE_ROTATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (18)].d),
 		   (yyvsp[(6) - (18)].v)[0], (yyvsp[(6) - (18)].v)[1], (yyvsp[(6) - (18)].v)[2], (yyvsp[(8) - (18)].v)[0], (yyvsp[(8) - (18)].v)[1], (yyvsp[(8) - (18)].v)[2], (yyvsp[(10) - (18)].v)[0], (yyvsp[(10) - (18)].v)[1], (yyvsp[(10) - (18)].v)[2], (yyvsp[(12) - (18)].d),
 		   &extr, (yyval.l));
-    ;}
+    }
     break;
 
   case 240:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3070 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
-    ;}
+    }
     break;
 
   case 241:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3075 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE_ROTATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (18)].d),
 		   (yyvsp[(6) - (18)].v)[0], (yyvsp[(6) - (18)].v)[1], (yyvsp[(6) - (18)].v)[2], (yyvsp[(8) - (18)].v)[0], (yyvsp[(8) - (18)].v)[1], (yyvsp[(8) - (18)].v)[2], (yyvsp[(10) - (18)].v)[0], (yyvsp[(10) - (18)].v)[1], (yyvsp[(10) - (18)].v)[2], (yyvsp[(12) - (18)].d),
 		   &extr, (yyval.l));
-    ;}
+    }
     break;
 
   case 242:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3086 "Gmsh.y"
     {
-    ;}
+    }
     break;
 
   case 243:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3089 "Gmsh.y"
     {
-    ;}
+    }
     break;
 
   case 244:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3095 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = true;
@@ -7911,12 +7933,12 @@ yyreduce:
       extr.mesh.hLayer.clear();
       extr.mesh.NbElmLayer.push_back((int)fabs((yyvsp[(3) - (5)].d)));
       extr.mesh.hLayer.push_back(1.);
-    ;}
+    }
     break;
 
   case 245:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3104 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = true;
@@ -7936,12 +7958,12 @@ yyreduce:
 	yymsg(0, "Wrong layer definition {%d, %d}", List_Nbr((yyvsp[(3) - (7)].l)), List_Nbr((yyvsp[(5) - (7)].l)));
       List_Delete((yyvsp[(3) - (7)].l));
       List_Delete((yyvsp[(5) - (7)].l));
-    ;}
+    }
     break;
 
   case 246:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3124 "Gmsh.y"
     {
       yymsg(0, "Explicit region numbers in layers are deprecated");
@@ -7964,57 +7986,57 @@ yyreduce:
       List_Delete((yyvsp[(3) - (9)].l));
       List_Delete((yyvsp[(5) - (9)].l));
       List_Delete((yyvsp[(7) - (9)].l));
-    ;}
+    }
     break;
 
   case 247:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3147 "Gmsh.y"
     {
       extr.mesh.Recombine = true;
-    ;}
+    }
     break;
 
   case 248:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3151 "Gmsh.y"
     {
       extr.mesh.QuadToTri = QUADTRI_DBL_1;
-    ;}
+    }
     break;
 
   case 249:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3155 "Gmsh.y"
     {
       extr.mesh.QuadToTri = QUADTRI_DBL_1_RECOMB;
-    ;}
+    }
     break;
 
   case 250:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3159 "Gmsh.y"
     {
       extr.mesh.QuadToTri = QUADTRI_SNGL_1;
-    ;}
+    }
     break;
 
   case 251:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3163 "Gmsh.y"
     {
       extr.mesh.QuadToTri = QUADTRI_SNGL_1_RECOMB;
-    ;}
+    }
     break;
 
   case 252:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3167 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (9)].d);
@@ -8033,12 +8055,12 @@ yyreduce:
 	}
       }
       List_Delete((yyvsp[(6) - (9)].l));
-    ;}
+    }
     break;
 
   case 253:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3186 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (6)].c), "Index"))
@@ -8046,21 +8068,21 @@ yyreduce:
       else if(!strcmp((yyvsp[(2) - (6)].c), "View"))
         extr.mesh.ViewIndex = (yyvsp[(4) - (6)].d);
       Free((yyvsp[(2) - (6)].c));
-    ;}
+    }
     break;
 
   case 254:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3198 "Gmsh.y"
     {
       (yyval.v)[0] = (yyval.v)[1] = 1.;
-    ;}
+    }
     break;
 
   case 255:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3202 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (3)].c), "Progression") || !strcmp((yyvsp[(2) - (3)].c), "Power"))
@@ -8073,21 +8095,21 @@ yyreduce:
       }
       (yyval.v)[1] = (yyvsp[(3) - (3)].d);
       Free((yyvsp[(2) - (3)].c));
-    ;}
+    }
     break;
 
   case 256:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3217 "Gmsh.y"
     {
       (yyval.i) = -1; // left
-    ;}
+    }
     break;
 
   case 257:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3221 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (1)].c), "Right"))
@@ -8097,48 +8119,48 @@ yyreduce:
       else // alternated
         (yyval.i) = 0;
       Free((yyvsp[(1) - (1)].c));
-    ;}
+    }
     break;
 
   case 258:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3233 "Gmsh.y"
     {
      (yyval.l) = List_Create(1, 1, sizeof(double));
-   ;}
+   }
     break;
 
   case 259:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3237 "Gmsh.y"
     {
      (yyval.l) = (yyvsp[(2) - (2)].l);
-   ;}
+   }
     break;
 
   case 260:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3242 "Gmsh.y"
     {
       (yyval.i) = 45;
-    ;}
+    }
     break;
 
   case 261:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3246 "Gmsh.y"
     {
       (yyval.i) = (int)(yyvsp[(2) - (2)].d);
-    ;}
+    }
     break;
 
   case 262:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3253 "Gmsh.y"
     {
       int type = (int)(yyvsp[(6) - (7)].v)[0];
@@ -8194,12 +8216,12 @@ yyreduce:
         }
         List_Delete((yyvsp[(3) - (7)].l));
       }
-    ;}
+    }
     break;
 
   case 263:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3309 "Gmsh.y"
     {
       int k = List_Nbr((yyvsp[(4) - (6)].l));
@@ -8269,22 +8291,22 @@ yyreduce:
         }
       }
       List_Delete((yyvsp[(4) - (6)].l));
-    ;}
+    }
     break;
 
   case 264:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3379 "Gmsh.y"
     {
       yymsg(1, "Elliptic Surface is deprecated: use Transfinite instead (with smoothing)");
       List_Delete((yyvsp[(7) - (8)].l));
-    ;}
+    }
     break;
 
   case 265:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3384 "Gmsh.y"
     {
       int k = List_Nbr((yyvsp[(4) - (5)].l));
@@ -8351,12 +8373,12 @@ yyreduce:
         }
       }
       List_Delete((yyvsp[(4) - (5)].l));
-    ;}
+    }
     break;
 
   case 266:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3451 "Gmsh.y"
     {
       if(!(yyvsp[(2) - (3)].l)){
@@ -8392,12 +8414,12 @@ yyreduce:
         }
         List_Delete((yyvsp[(2) - (3)].l));
       }
-    ;}
+    }
     break;
 
   case 267:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3487 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (7)].l)); i++){
@@ -8405,12 +8427,12 @@ yyreduce:
 	List_Read((yyvsp[(4) - (7)].l), i, &d);
 	CTX::instance()->mesh.algo2d_per_face[(int)d] = (int)(yyvsp[(6) - (7)].d);
       }
-    ;}
+    }
     break;
 
   case 268:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3496 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (5)].l)){
@@ -8453,12 +8475,12 @@ yyreduce:
         }
         List_Delete((yyvsp[(3) - (5)].l));
       }
-    ;}
+    }
     break;
 
   case 269:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3539 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (6)].l)); i++){
@@ -8478,12 +8500,12 @@ yyreduce:
         }
       }
       List_Delete((yyvsp[(3) - (6)].l));
-    ;}
+    }
     break;
 
   case 270:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3564 "Gmsh.y"
     {
       if(List_Nbr((yyvsp[(5) - (6)].l)) != List_Nbr((yyvsp[(3) - (6)].l))){
@@ -8510,12 +8532,12 @@ yyreduce:
       }
       List_Delete((yyvsp[(3) - (6)].l));
       List_Delete((yyvsp[(5) - (6)].l));
-    ;}
+    }
     break;
 
   case 271:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3592 "Gmsh.y"
     {
       if (List_Nbr((yyvsp[(5) - (12)].l)) != List_Nbr((yyvsp[(10) - (12)].l))){
@@ -8551,12 +8573,12 @@ yyreduce:
       }
       List_Delete((yyvsp[(5) - (12)].l));
       List_Delete((yyvsp[(10) - (12)].l));
-    ;}
+    }
     break;
 
   case 272:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3635 "Gmsh.y"
     {
       Surface *s = FindSurface((int)(yyvsp[(8) - (10)].d));
@@ -8579,12 +8601,12 @@ yyreduce:
         else
           yymsg(0, "Unknown surface %d", (int)(yyvsp[(8) - (10)].d));
       }
-    ;}
+    }
     break;
 
   case 273:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3658 "Gmsh.y"
     {
       Surface *s = FindSurface((int)(yyvsp[(8) - (10)].d));
@@ -8607,37 +8629,37 @@ yyreduce:
         else
           yymsg(0, "Unknown surface %d", (int)(yyvsp[(8) - (10)].d));
       }
-    ;}
+    }
     break;
 
   case 274:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3681 "Gmsh.y"
     {
-    ;}
+    }
     break;
 
   case 275:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3684 "Gmsh.y"
     {
-    ;}
+    }
     break;
 
   case 276:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3693 "Gmsh.y"
     {
       ReplaceAllDuplicates();
-    ;}
+    }
     break;
 
   case 277:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3697 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (3)].c), "Geometry"))
@@ -8647,12 +8669,12 @@ yyreduce:
       else
         yymsg(0, "Unknown coherence command");
       Free((yyvsp[(2) - (3)].c));
-    ;}
+    }
     break;
 
   case 278:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3707 "Gmsh.y"
     {
       if(List_Nbr((yyvsp[(4) - (6)].l)) >= 2){
@@ -8682,39 +8704,37 @@ yyreduce:
         yymsg(0, "Need at least two points to merge");
       ReplaceAllDuplicates();
       List_Delete((yyvsp[(4) - (6)].l));
-    ;}
+    }
     break;
 
   case 279:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3741 "Gmsh.y"
-    { (yyval.c) = (char*)"Homology"; ;}
+    { (yyval.c) = (char*)"Homology"; }
     break;
 
   case 280:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3742 "Gmsh.y"
-    { (yyval.c) = (char*)"Cohomology"; ;}
+    { (yyval.c) = (char*)"Cohomology"; }
     break;
 
   case 281:
 
-/* Line 1464 of yacc.c  */
+/* Line 1806 of yacc.c  */
 #line 3747 "Gmsh.y"
     {
       std::vector<int> domain, subdomain, dim;
-      if(GModel::current()->getDim() != 1) dim.push_back(1);
-      if(GModel::current()->getDim() != 2) dim.push_back(2);
       GModel::current()->addHomologyRequest((yyvsp[(1) - (2)].c), domain, subdomain, dim);
-    ;}
+    }
     break;
 
   case 282:
 
-/* Line 1464 of yacc.c  */
-#line 3754 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 3752 "Gmsh.y"
     {
       std::vector<int> domain, subdomain, dim;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (5)].l)); i++){
@@ -8722,17 +8742,15 @@ yyreduce:
         List_Read((yyvsp[(3) - (5)].l), i, &d);
         domain.push_back((int)d);
       }
-      if(GModel::current()->getDim() != 1) dim.push_back(1);
-      if(GModel::current()->getDim() != 2) dim.push_back(2);
       GModel::current()->addHomologyRequest((yyvsp[(1) - (5)].c), domain, subdomain, dim);
       List_Delete((yyvsp[(3) - (5)].l));
-    ;}
+    }
     break;
 
   case 283:
 
-/* Line 1464 of yacc.c  */
-#line 3767 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 3763 "Gmsh.y"
     {
       std::vector<int> domain, subdomain, dim;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (7)].l)); i++){
@@ -8745,18 +8763,16 @@ yyreduce:
         List_Read((yyvsp[(5) - (7)].l), i, &d);
         subdomain.push_back((int)d);
       }
-      if(GModel::current()->getDim() != 1) dim.push_back(1);
-      if(GModel::current()->getDim() != 2) dim.push_back(2);
       GModel::current()->addHomologyRequest((yyvsp[(1) - (7)].c), domain, subdomain, dim);
       List_Delete((yyvsp[(3) - (7)].l));
       List_Delete((yyvsp[(5) - (7)].l));
-    ;}
+    }
     break;
 
   case 284:
 
-/* Line 1464 of yacc.c  */
-#line 3786 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 3780 "Gmsh.y"
     {
       std::vector<int> domain, subdomain, dim;
       for(int i = 0; i < List_Nbr((yyvsp[(6) - (10)].l)); i++){
@@ -8778,501 +8794,501 @@ yyreduce:
       List_Delete((yyvsp[(6) - (10)].l));
       List_Delete((yyvsp[(8) - (10)].l));
       List_Delete((yyvsp[(3) - (10)].l));
-    ;}
+    }
     break;
 
   case 285:
 
-/* Line 1464 of yacc.c  */
-#line 3813 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(1) - (1)].d);           ;}
+/* Line 1806 of yacc.c  */
+#line 3807 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(1) - (1)].d);           }
     break;
 
   case 286:
 
-/* Line 1464 of yacc.c  */
-#line 3814 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(2) - (3)].d);           ;}
+/* Line 1806 of yacc.c  */
+#line 3808 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(2) - (3)].d);           }
     break;
 
   case 287:
 
-/* Line 1464 of yacc.c  */
-#line 3815 "Gmsh.y"
-    { (yyval.d) = -(yyvsp[(2) - (2)].d);          ;}
+/* Line 1806 of yacc.c  */
+#line 3809 "Gmsh.y"
+    { (yyval.d) = -(yyvsp[(2) - (2)].d);          }
     break;
 
   case 288:
 
-/* Line 1464 of yacc.c  */
-#line 3816 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(2) - (2)].d);           ;}
+/* Line 1806 of yacc.c  */
+#line 3810 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(2) - (2)].d);           }
     break;
 
   case 289:
 
-/* Line 1464 of yacc.c  */
-#line 3817 "Gmsh.y"
-    { (yyval.d) = !(yyvsp[(2) - (2)].d);          ;}
+/* Line 1806 of yacc.c  */
+#line 3811 "Gmsh.y"
+    { (yyval.d) = !(yyvsp[(2) - (2)].d);          }
     break;
 
   case 290:
 
-/* Line 1464 of yacc.c  */
-#line 3818 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(1) - (3)].d) - (yyvsp[(3) - (3)].d);      ;}
+/* Line 1806 of yacc.c  */
+#line 3812 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(1) - (3)].d) - (yyvsp[(3) - (3)].d);      }
     break;
 
   case 291:
 
-/* Line 1464 of yacc.c  */
-#line 3819 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(1) - (3)].d) + (yyvsp[(3) - (3)].d);      ;}
+/* Line 1806 of yacc.c  */
+#line 3813 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(1) - (3)].d) + (yyvsp[(3) - (3)].d);      }
     break;
 
   case 292:
 
-/* Line 1464 of yacc.c  */
-#line 3820 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(1) - (3)].d) * (yyvsp[(3) - (3)].d);      ;}
+/* Line 1806 of yacc.c  */
+#line 3814 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(1) - (3)].d) * (yyvsp[(3) - (3)].d);      }
     break;
 
   case 293:
 
-/* Line 1464 of yacc.c  */
-#line 3822 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 3816 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (3)].d))
 	yymsg(0, "Division by zero in '%g / %g'", (yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].d));
       else
 	(yyval.d) = (yyvsp[(1) - (3)].d) / (yyvsp[(3) - (3)].d);
-    ;}
+    }
     break;
 
   case 294:
 
-/* Line 1464 of yacc.c  */
-#line 3828 "Gmsh.y"
-    { (yyval.d) = (int)(yyvsp[(1) - (3)].d) % (int)(yyvsp[(3) - (3)].d);  ;}
+/* Line 1806 of yacc.c  */
+#line 3822 "Gmsh.y"
+    { (yyval.d) = (int)(yyvsp[(1) - (3)].d) % (int)(yyvsp[(3) - (3)].d);  }
     break;
 
   case 295:
 
-/* Line 1464 of yacc.c  */
-#line 3829 "Gmsh.y"
-    { (yyval.d) = pow((yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].d));  ;}
+/* Line 1806 of yacc.c  */
+#line 3823 "Gmsh.y"
+    { (yyval.d) = pow((yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].d));  }
     break;
 
   case 296:
 
-/* Line 1464 of yacc.c  */
-#line 3830 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(1) - (3)].d) < (yyvsp[(3) - (3)].d);      ;}
+/* Line 1806 of yacc.c  */
+#line 3824 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(1) - (3)].d) < (yyvsp[(3) - (3)].d);      }
     break;
 
   case 297:
 
-/* Line 1464 of yacc.c  */
-#line 3831 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(1) - (3)].d) > (yyvsp[(3) - (3)].d);      ;}
+/* Line 1806 of yacc.c  */
+#line 3825 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(1) - (3)].d) > (yyvsp[(3) - (3)].d);      }
     break;
 
   case 298:
 
-/* Line 1464 of yacc.c  */
-#line 3832 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(1) - (3)].d) <= (yyvsp[(3) - (3)].d);     ;}
+/* Line 1806 of yacc.c  */
+#line 3826 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(1) - (3)].d) <= (yyvsp[(3) - (3)].d);     }
     break;
 
   case 299:
 
-/* Line 1464 of yacc.c  */
-#line 3833 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(1) - (3)].d) >= (yyvsp[(3) - (3)].d);     ;}
+/* Line 1806 of yacc.c  */
+#line 3827 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(1) - (3)].d) >= (yyvsp[(3) - (3)].d);     }
     break;
 
   case 300:
 
-/* Line 1464 of yacc.c  */
-#line 3834 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(1) - (3)].d) == (yyvsp[(3) - (3)].d);     ;}
+/* Line 1806 of yacc.c  */
+#line 3828 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(1) - (3)].d) == (yyvsp[(3) - (3)].d);     }
     break;
 
   case 301:
 
-/* Line 1464 of yacc.c  */
-#line 3835 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(1) - (3)].d) != (yyvsp[(3) - (3)].d);     ;}
+/* Line 1806 of yacc.c  */
+#line 3829 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(1) - (3)].d) != (yyvsp[(3) - (3)].d);     }
     break;
 
   case 302:
 
-/* Line 1464 of yacc.c  */
-#line 3836 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(1) - (3)].d) && (yyvsp[(3) - (3)].d);     ;}
+/* Line 1806 of yacc.c  */
+#line 3830 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(1) - (3)].d) && (yyvsp[(3) - (3)].d);     }
     break;
 
   case 303:
 
-/* Line 1464 of yacc.c  */
-#line 3837 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(1) - (3)].d) || (yyvsp[(3) - (3)].d);     ;}
+/* Line 1806 of yacc.c  */
+#line 3831 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(1) - (3)].d) || (yyvsp[(3) - (3)].d);     }
     break;
 
   case 304:
 
-/* Line 1464 of yacc.c  */
-#line 3838 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(1) - (5)].d) ? (yyvsp[(3) - (5)].d) : (yyvsp[(5) - (5)].d); ;}
+/* Line 1806 of yacc.c  */
+#line 3832 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(1) - (5)].d) ? (yyvsp[(3) - (5)].d) : (yyvsp[(5) - (5)].d); }
     break;
 
   case 305:
 
-/* Line 1464 of yacc.c  */
-#line 3839 "Gmsh.y"
-    { (yyval.d) = exp((yyvsp[(3) - (4)].d));      ;}
+/* Line 1806 of yacc.c  */
+#line 3833 "Gmsh.y"
+    { (yyval.d) = exp((yyvsp[(3) - (4)].d));      }
     break;
 
   case 306:
 
-/* Line 1464 of yacc.c  */
-#line 3840 "Gmsh.y"
-    { (yyval.d) = log((yyvsp[(3) - (4)].d));      ;}
+/* Line 1806 of yacc.c  */
+#line 3834 "Gmsh.y"
+    { (yyval.d) = log((yyvsp[(3) - (4)].d));      }
     break;
 
   case 307:
 
-/* Line 1464 of yacc.c  */
-#line 3841 "Gmsh.y"
-    { (yyval.d) = log10((yyvsp[(3) - (4)].d));    ;}
+/* Line 1806 of yacc.c  */
+#line 3835 "Gmsh.y"
+    { (yyval.d) = log10((yyvsp[(3) - (4)].d));    }
     break;
 
   case 308:
 
-/* Line 1464 of yacc.c  */
-#line 3842 "Gmsh.y"
-    { (yyval.d) = sqrt((yyvsp[(3) - (4)].d));     ;}
+/* Line 1806 of yacc.c  */
+#line 3836 "Gmsh.y"
+    { (yyval.d) = sqrt((yyvsp[(3) - (4)].d));     }
     break;
 
   case 309:
 
-/* Line 1464 of yacc.c  */
-#line 3843 "Gmsh.y"
-    { (yyval.d) = sin((yyvsp[(3) - (4)].d));      ;}
+/* Line 1806 of yacc.c  */
+#line 3837 "Gmsh.y"
+    { (yyval.d) = sin((yyvsp[(3) - (4)].d));      }
     break;
 
   case 310:
 
-/* Line 1464 of yacc.c  */
-#line 3844 "Gmsh.y"
-    { (yyval.d) = asin((yyvsp[(3) - (4)].d));     ;}
+/* Line 1806 of yacc.c  */
+#line 3838 "Gmsh.y"
+    { (yyval.d) = asin((yyvsp[(3) - (4)].d));     }
     break;
 
   case 311:
 
-/* Line 1464 of yacc.c  */
-#line 3845 "Gmsh.y"
-    { (yyval.d) = cos((yyvsp[(3) - (4)].d));      ;}
+/* Line 1806 of yacc.c  */
+#line 3839 "Gmsh.y"
+    { (yyval.d) = cos((yyvsp[(3) - (4)].d));      }
     break;
 
   case 312:
 
-/* Line 1464 of yacc.c  */
-#line 3846 "Gmsh.y"
-    { (yyval.d) = acos((yyvsp[(3) - (4)].d));     ;}
+/* Line 1806 of yacc.c  */
+#line 3840 "Gmsh.y"
+    { (yyval.d) = acos((yyvsp[(3) - (4)].d));     }
     break;
 
   case 313:
 
-/* Line 1464 of yacc.c  */
-#line 3847 "Gmsh.y"
-    { (yyval.d) = tan((yyvsp[(3) - (4)].d));      ;}
+/* Line 1806 of yacc.c  */
+#line 3841 "Gmsh.y"
+    { (yyval.d) = tan((yyvsp[(3) - (4)].d));      }
     break;
 
   case 314:
 
-/* Line 1464 of yacc.c  */
-#line 3848 "Gmsh.y"
-    { (yyval.d) = atan((yyvsp[(3) - (4)].d));     ;}
+/* Line 1806 of yacc.c  */
+#line 3842 "Gmsh.y"
+    { (yyval.d) = atan((yyvsp[(3) - (4)].d));     }
     break;
 
   case 315:
 
-/* Line 1464 of yacc.c  */
-#line 3849 "Gmsh.y"
-    { (yyval.d) = atan2((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d));;}
+/* Line 1806 of yacc.c  */
+#line 3843 "Gmsh.y"
+    { (yyval.d) = atan2((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d));}
     break;
 
   case 316:
 
-/* Line 1464 of yacc.c  */
-#line 3850 "Gmsh.y"
-    { (yyval.d) = sinh((yyvsp[(3) - (4)].d));     ;}
+/* Line 1806 of yacc.c  */
+#line 3844 "Gmsh.y"
+    { (yyval.d) = sinh((yyvsp[(3) - (4)].d));     }
     break;
 
   case 317:
 
-/* Line 1464 of yacc.c  */
-#line 3851 "Gmsh.y"
-    { (yyval.d) = cosh((yyvsp[(3) - (4)].d));     ;}
+/* Line 1806 of yacc.c  */
+#line 3845 "Gmsh.y"
+    { (yyval.d) = cosh((yyvsp[(3) - (4)].d));     }
     break;
 
   case 318:
 
-/* Line 1464 of yacc.c  */
-#line 3852 "Gmsh.y"
-    { (yyval.d) = tanh((yyvsp[(3) - (4)].d));     ;}
+/* Line 1806 of yacc.c  */
+#line 3846 "Gmsh.y"
+    { (yyval.d) = tanh((yyvsp[(3) - (4)].d));     }
     break;
 
   case 319:
 
-/* Line 1464 of yacc.c  */
-#line 3853 "Gmsh.y"
-    { (yyval.d) = fabs((yyvsp[(3) - (4)].d));     ;}
+/* Line 1806 of yacc.c  */
+#line 3847 "Gmsh.y"
+    { (yyval.d) = fabs((yyvsp[(3) - (4)].d));     }
     break;
 
   case 320:
 
-/* Line 1464 of yacc.c  */
-#line 3854 "Gmsh.y"
-    { (yyval.d) = floor((yyvsp[(3) - (4)].d));    ;}
+/* Line 1806 of yacc.c  */
+#line 3848 "Gmsh.y"
+    { (yyval.d) = floor((yyvsp[(3) - (4)].d));    }
     break;
 
   case 321:
 
-/* Line 1464 of yacc.c  */
-#line 3855 "Gmsh.y"
-    { (yyval.d) = ceil((yyvsp[(3) - (4)].d));     ;}
+/* Line 1806 of yacc.c  */
+#line 3849 "Gmsh.y"
+    { (yyval.d) = ceil((yyvsp[(3) - (4)].d));     }
     break;
 
   case 322:
 
-/* Line 1464 of yacc.c  */
-#line 3856 "Gmsh.y"
-    { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
+/* Line 1806 of yacc.c  */
+#line 3850 "Gmsh.y"
+    { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); }
     break;
 
   case 323:
 
-/* Line 1464 of yacc.c  */
-#line 3857 "Gmsh.y"
-    { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
+/* Line 1806 of yacc.c  */
+#line 3851 "Gmsh.y"
+    { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); }
     break;
 
   case 324:
 
-/* Line 1464 of yacc.c  */
-#line 3858 "Gmsh.y"
-    { (yyval.d) = sqrt((yyvsp[(3) - (6)].d) * (yyvsp[(3) - (6)].d) + (yyvsp[(5) - (6)].d) * (yyvsp[(5) - (6)].d)); ;}
+/* Line 1806 of yacc.c  */
+#line 3852 "Gmsh.y"
+    { (yyval.d) = sqrt((yyvsp[(3) - (6)].d) * (yyvsp[(3) - (6)].d) + (yyvsp[(5) - (6)].d) * (yyvsp[(5) - (6)].d)); }
     break;
 
   case 325:
 
-/* Line 1464 of yacc.c  */
-#line 3859 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(3) - (4)].d) * (double)rand() / (double)RAND_MAX; ;}
+/* Line 1806 of yacc.c  */
+#line 3853 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(3) - (4)].d) * (double)rand() / (double)RAND_MAX; }
     break;
 
   case 326:
 
-/* Line 1464 of yacc.c  */
-#line 3861 "Gmsh.y"
-    { (yyval.d) = exp((yyvsp[(3) - (4)].d));      ;}
+/* Line 1806 of yacc.c  */
+#line 3855 "Gmsh.y"
+    { (yyval.d) = exp((yyvsp[(3) - (4)].d));      }
     break;
 
   case 327:
 
-/* Line 1464 of yacc.c  */
-#line 3862 "Gmsh.y"
-    { (yyval.d) = log((yyvsp[(3) - (4)].d));      ;}
+/* Line 1806 of yacc.c  */
+#line 3856 "Gmsh.y"
+    { (yyval.d) = log((yyvsp[(3) - (4)].d));      }
     break;
 
   case 328:
 
-/* Line 1464 of yacc.c  */
-#line 3863 "Gmsh.y"
-    { (yyval.d) = log10((yyvsp[(3) - (4)].d));    ;}
+/* Line 1806 of yacc.c  */
+#line 3857 "Gmsh.y"
+    { (yyval.d) = log10((yyvsp[(3) - (4)].d));    }
     break;
 
   case 329:
 
-/* Line 1464 of yacc.c  */
-#line 3864 "Gmsh.y"
-    { (yyval.d) = sqrt((yyvsp[(3) - (4)].d));     ;}
+/* Line 1806 of yacc.c  */
+#line 3858 "Gmsh.y"
+    { (yyval.d) = sqrt((yyvsp[(3) - (4)].d));     }
     break;
 
   case 330:
 
-/* Line 1464 of yacc.c  */
-#line 3865 "Gmsh.y"
-    { (yyval.d) = sin((yyvsp[(3) - (4)].d));      ;}
+/* Line 1806 of yacc.c  */
+#line 3859 "Gmsh.y"
+    { (yyval.d) = sin((yyvsp[(3) - (4)].d));      }
     break;
 
   case 331:
 
-/* Line 1464 of yacc.c  */
-#line 3866 "Gmsh.y"
-    { (yyval.d) = asin((yyvsp[(3) - (4)].d));     ;}
+/* Line 1806 of yacc.c  */
+#line 3860 "Gmsh.y"
+    { (yyval.d) = asin((yyvsp[(3) - (4)].d));     }
     break;
 
   case 332:
 
-/* Line 1464 of yacc.c  */
-#line 3867 "Gmsh.y"
-    { (yyval.d) = cos((yyvsp[(3) - (4)].d));      ;}
+/* Line 1806 of yacc.c  */
+#line 3861 "Gmsh.y"
+    { (yyval.d) = cos((yyvsp[(3) - (4)].d));      }
     break;
 
   case 333:
 
-/* Line 1464 of yacc.c  */
-#line 3868 "Gmsh.y"
-    { (yyval.d) = acos((yyvsp[(3) - (4)].d));     ;}
+/* Line 1806 of yacc.c  */
+#line 3862 "Gmsh.y"
+    { (yyval.d) = acos((yyvsp[(3) - (4)].d));     }
     break;
 
   case 334:
 
-/* Line 1464 of yacc.c  */
-#line 3869 "Gmsh.y"
-    { (yyval.d) = tan((yyvsp[(3) - (4)].d));      ;}
+/* Line 1806 of yacc.c  */
+#line 3863 "Gmsh.y"
+    { (yyval.d) = tan((yyvsp[(3) - (4)].d));      }
     break;
 
   case 335:
 
-/* Line 1464 of yacc.c  */
-#line 3870 "Gmsh.y"
-    { (yyval.d) = atan((yyvsp[(3) - (4)].d));     ;}
+/* Line 1806 of yacc.c  */
+#line 3864 "Gmsh.y"
+    { (yyval.d) = atan((yyvsp[(3) - (4)].d));     }
     break;
 
   case 336:
 
-/* Line 1464 of yacc.c  */
-#line 3871 "Gmsh.y"
-    { (yyval.d) = atan2((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d));;}
+/* Line 1806 of yacc.c  */
+#line 3865 "Gmsh.y"
+    { (yyval.d) = atan2((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d));}
     break;
 
   case 337:
 
-/* Line 1464 of yacc.c  */
-#line 3872 "Gmsh.y"
-    { (yyval.d) = sinh((yyvsp[(3) - (4)].d));     ;}
+/* Line 1806 of yacc.c  */
+#line 3866 "Gmsh.y"
+    { (yyval.d) = sinh((yyvsp[(3) - (4)].d));     }
     break;
 
   case 338:
 
-/* Line 1464 of yacc.c  */
-#line 3873 "Gmsh.y"
-    { (yyval.d) = cosh((yyvsp[(3) - (4)].d));     ;}
+/* Line 1806 of yacc.c  */
+#line 3867 "Gmsh.y"
+    { (yyval.d) = cosh((yyvsp[(3) - (4)].d));     }
     break;
 
   case 339:
 
-/* Line 1464 of yacc.c  */
-#line 3874 "Gmsh.y"
-    { (yyval.d) = tanh((yyvsp[(3) - (4)].d));     ;}
+/* Line 1806 of yacc.c  */
+#line 3868 "Gmsh.y"
+    { (yyval.d) = tanh((yyvsp[(3) - (4)].d));     }
     break;
 
   case 340:
 
-/* Line 1464 of yacc.c  */
-#line 3875 "Gmsh.y"
-    { (yyval.d) = fabs((yyvsp[(3) - (4)].d));     ;}
+/* Line 1806 of yacc.c  */
+#line 3869 "Gmsh.y"
+    { (yyval.d) = fabs((yyvsp[(3) - (4)].d));     }
     break;
 
   case 341:
 
-/* Line 1464 of yacc.c  */
-#line 3876 "Gmsh.y"
-    { (yyval.d) = floor((yyvsp[(3) - (4)].d));    ;}
+/* Line 1806 of yacc.c  */
+#line 3870 "Gmsh.y"
+    { (yyval.d) = floor((yyvsp[(3) - (4)].d));    }
     break;
 
   case 342:
 
-/* Line 1464 of yacc.c  */
-#line 3877 "Gmsh.y"
-    { (yyval.d) = ceil((yyvsp[(3) - (4)].d));     ;}
+/* Line 1806 of yacc.c  */
+#line 3871 "Gmsh.y"
+    { (yyval.d) = ceil((yyvsp[(3) - (4)].d));     }
     break;
 
   case 343:
 
-/* Line 1464 of yacc.c  */
-#line 3878 "Gmsh.y"
-    { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
+/* Line 1806 of yacc.c  */
+#line 3872 "Gmsh.y"
+    { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); }
     break;
 
   case 344:
 
-/* Line 1464 of yacc.c  */
-#line 3879 "Gmsh.y"
-    { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
+/* Line 1806 of yacc.c  */
+#line 3873 "Gmsh.y"
+    { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); }
     break;
 
   case 345:
 
-/* Line 1464 of yacc.c  */
-#line 3880 "Gmsh.y"
-    { (yyval.d) = sqrt((yyvsp[(3) - (6)].d) * (yyvsp[(3) - (6)].d) + (yyvsp[(5) - (6)].d) * (yyvsp[(5) - (6)].d)); ;}
+/* Line 1806 of yacc.c  */
+#line 3874 "Gmsh.y"
+    { (yyval.d) = sqrt((yyvsp[(3) - (6)].d) * (yyvsp[(3) - (6)].d) + (yyvsp[(5) - (6)].d) * (yyvsp[(5) - (6)].d)); }
     break;
 
   case 346:
 
-/* Line 1464 of yacc.c  */
-#line 3881 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(3) - (4)].d) * (double)rand() / (double)RAND_MAX; ;}
+/* Line 1806 of yacc.c  */
+#line 3875 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(3) - (4)].d) * (double)rand() / (double)RAND_MAX; }
     break;
 
   case 347:
 
-/* Line 1464 of yacc.c  */
-#line 3890 "Gmsh.y"
-    { (yyval.d) = (yyvsp[(1) - (1)].d); ;}
+/* Line 1806 of yacc.c  */
+#line 3884 "Gmsh.y"
+    { (yyval.d) = (yyvsp[(1) - (1)].d); }
     break;
 
   case 348:
 
-/* Line 1464 of yacc.c  */
-#line 3891 "Gmsh.y"
-    { (yyval.d) = 3.141592653589793; ;}
+/* Line 1806 of yacc.c  */
+#line 3885 "Gmsh.y"
+    { (yyval.d) = 3.141592653589793; }
     break;
 
   case 349:
 
-/* Line 1464 of yacc.c  */
-#line 3892 "Gmsh.y"
-    { (yyval.d) = Msg::GetCommRank(); ;}
+/* Line 1806 of yacc.c  */
+#line 3886 "Gmsh.y"
+    { (yyval.d) = Msg::GetCommRank(); }
     break;
 
   case 350:
 
-/* Line 1464 of yacc.c  */
-#line 3893 "Gmsh.y"
-    { (yyval.d) = Msg::GetCommSize(); ;}
+/* Line 1806 of yacc.c  */
+#line 3887 "Gmsh.y"
+    { (yyval.d) = Msg::GetCommSize(); }
     break;
 
   case 351:
 
-/* Line 1464 of yacc.c  */
-#line 3894 "Gmsh.y"
-    { (yyval.d) = GetGmshMajorVersion(); ;}
+/* Line 1806 of yacc.c  */
+#line 3888 "Gmsh.y"
+    { (yyval.d) = GetGmshMajorVersion(); }
     break;
 
   case 352:
 
-/* Line 1464 of yacc.c  */
-#line 3895 "Gmsh.y"
-    { (yyval.d) = GetGmshMinorVersion(); ;}
+/* Line 1806 of yacc.c  */
+#line 3889 "Gmsh.y"
+    { (yyval.d) = GetGmshMinorVersion(); }
     break;
 
   case 353:
 
-/* Line 1464 of yacc.c  */
-#line 3896 "Gmsh.y"
-    { (yyval.d) = GetGmshPatchVersion(); ;}
+/* Line 1806 of yacc.c  */
+#line 3890 "Gmsh.y"
+    { (yyval.d) = GetGmshPatchVersion(); }
     break;
 
   case 354:
 
-/* Line 1464 of yacc.c  */
-#line 3901 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 3895 "Gmsh.y"
     {
       if(!gmsh_yysymbols.count((yyvsp[(1) - (1)].c))){
 	yymsg(0, "Unknown variable '%s'", (yyvsp[(1) - (1)].c));
@@ -9288,13 +9304,13 @@ yyreduce:
           (yyval.d) = s.value[0];
       }
       Free((yyvsp[(1) - (1)].c));
-    ;}
+    }
     break;
 
   case 355:
 
-/* Line 1464 of yacc.c  */
-#line 3921 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 3915 "Gmsh.y"
     {
       char tmpstring[1024];
       sprintf(tmpstring, "%s_%d", (yyvsp[(1) - (5)].c), (int)(yyvsp[(4) - (5)].d)) ;
@@ -9312,13 +9328,13 @@ yyreduce:
           (yyval.d) = s.value[0];
       }
       Free((yyvsp[(1) - (5)].c));
-    ;}
+    }
     break;
 
   case 356:
 
-/* Line 1464 of yacc.c  */
-#line 3940 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 3934 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (4)].d);
       if(!gmsh_yysymbols.count((yyvsp[(1) - (4)].c))){
@@ -9335,13 +9351,13 @@ yyreduce:
           (yyval.d) = s.value[index];
       }
       Free((yyvsp[(1) - (4)].c));
-    ;}
+    }
     break;
 
   case 357:
 
-/* Line 1464 of yacc.c  */
-#line 3958 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 3952 "Gmsh.y"
     {
       if(!gmsh_yysymbols.count((yyvsp[(2) - (4)].c))){
 	yymsg(0, "Unknown variable '%s'", (yyvsp[(2) - (4)].c));
@@ -9352,13 +9368,13 @@ yyreduce:
 	(yyval.d) = s.value.size();
       }
       Free((yyvsp[(2) - (4)].c));
-    ;}
+    }
     break;
 
   case 358:
 
-/* Line 1464 of yacc.c  */
-#line 3970 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 3964 "Gmsh.y"
     {
       if(!gmsh_yysymbols.count((yyvsp[(1) - (2)].c))){
 	yymsg(0, "Unknown variable '%s'", (yyvsp[(1) - (2)].c));
@@ -9374,13 +9390,13 @@ yyreduce:
           (yyval.d) = (s.value[0] += (yyvsp[(2) - (2)].i));
       }
       Free((yyvsp[(1) - (2)].c));
-    ;}
+    }
     break;
 
   case 359:
 
-/* Line 1464 of yacc.c  */
-#line 3987 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 3981 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (5)].d);
       if(!gmsh_yysymbols.count((yyvsp[(1) - (5)].c))){
@@ -9397,33 +9413,33 @@ yyreduce:
           (yyval.d) = (s.value[index] += (yyvsp[(5) - (5)].i));
       }
       Free((yyvsp[(1) - (5)].c));
-    ;}
+    }
     break;
 
   case 360:
 
-/* Line 1464 of yacc.c  */
-#line 4008 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4002 "Gmsh.y"
     {
       NumberOption(GMSH_GET, (yyvsp[(1) - (3)].c), 0, (yyvsp[(3) - (3)].c), (yyval.d));
       Free((yyvsp[(1) - (3)].c)); Free((yyvsp[(3) - (3)].c));
-    ;}
+    }
     break;
 
   case 361:
 
-/* Line 1464 of yacc.c  */
-#line 4013 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4007 "Gmsh.y"
     {
       NumberOption(GMSH_GET, (yyvsp[(1) - (6)].c), (int)(yyvsp[(3) - (6)].d), (yyvsp[(6) - (6)].c), (yyval.d));
       Free((yyvsp[(1) - (6)].c)); Free((yyvsp[(6) - (6)].c));
-    ;}
+    }
     break;
 
   case 362:
 
-/* Line 1464 of yacc.c  */
-#line 4018 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4012 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (4)].c), 0, (yyvsp[(3) - (4)].c), d)){
@@ -9432,13 +9448,13 @@ yyreduce:
 	(yyval.d) = d;
       }
       Free((yyvsp[(1) - (4)].c)); Free((yyvsp[(3) - (4)].c));
-    ;}
+    }
     break;
 
   case 363:
 
-/* Line 1464 of yacc.c  */
-#line 4028 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4022 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (7)].c), (int)(yyvsp[(3) - (7)].d), (yyvsp[(6) - (7)].c), d)){
@@ -9447,196 +9463,196 @@ yyreduce:
 	(yyval.d) = d;
       }
       Free((yyvsp[(1) - (7)].c)); Free((yyvsp[(6) - (7)].c));
-    ;}
+    }
     break;
 
   case 364:
 
-/* Line 1464 of yacc.c  */
-#line 4038 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4032 "Gmsh.y"
     {
       (yyval.d) = Msg::GetValue((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].d));
       Free((yyvsp[(3) - (6)].c));
-    ;}
+    }
     break;
 
   case 365:
 
-/* Line 1464 of yacc.c  */
-#line 4046 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4040 "Gmsh.y"
     {
       memcpy((yyval.v), (yyvsp[(1) - (1)].v), 5*sizeof(double));
-    ;}
+    }
     break;
 
   case 366:
 
-/* Line 1464 of yacc.c  */
-#line 4050 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4044 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = -(yyvsp[(2) - (2)].v)[i];
-    ;}
+    }
     break;
 
   case 367:
 
-/* Line 1464 of yacc.c  */
-#line 4054 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4048 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(2) - (2)].v)[i];
-    ;}
+    }
     break;
 
   case 368:
 
-/* Line 1464 of yacc.c  */
-#line 4058 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4052 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(1) - (3)].v)[i] - (yyvsp[(3) - (3)].v)[i];
-    ;}
+    }
     break;
 
   case 369:
 
-/* Line 1464 of yacc.c  */
-#line 4062 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4056 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(1) - (3)].v)[i] + (yyvsp[(3) - (3)].v)[i];
-    ;}
+    }
     break;
 
   case 370:
 
-/* Line 1464 of yacc.c  */
-#line 4069 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4063 "Gmsh.y"
     {
       (yyval.v)[0] = (yyvsp[(2) - (11)].d);  (yyval.v)[1] = (yyvsp[(4) - (11)].d);  (yyval.v)[2] = (yyvsp[(6) - (11)].d);  (yyval.v)[3] = (yyvsp[(8) - (11)].d); (yyval.v)[4] = (yyvsp[(10) - (11)].d);
-    ;}
+    }
     break;
 
   case 371:
 
-/* Line 1464 of yacc.c  */
-#line 4073 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4067 "Gmsh.y"
     {
       (yyval.v)[0] = (yyvsp[(2) - (9)].d);  (yyval.v)[1] = (yyvsp[(4) - (9)].d);  (yyval.v)[2] = (yyvsp[(6) - (9)].d);  (yyval.v)[3] = (yyvsp[(8) - (9)].d); (yyval.v)[4] = 1.0;
-    ;}
+    }
     break;
 
   case 372:
 
-/* Line 1464 of yacc.c  */
-#line 4077 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4071 "Gmsh.y"
     {
       (yyval.v)[0] = (yyvsp[(2) - (7)].d);  (yyval.v)[1] = (yyvsp[(4) - (7)].d);  (yyval.v)[2] = (yyvsp[(6) - (7)].d);  (yyval.v)[3] = 0.0; (yyval.v)[4] = 1.0;
-    ;}
+    }
     break;
 
   case 373:
 
-/* Line 1464 of yacc.c  */
-#line 4081 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4075 "Gmsh.y"
     {
       (yyval.v)[0] = (yyvsp[(2) - (7)].d);  (yyval.v)[1] = (yyvsp[(4) - (7)].d);  (yyval.v)[2] = (yyvsp[(6) - (7)].d);  (yyval.v)[3] = 0.0; (yyval.v)[4] = 1.0;
-    ;}
+    }
     break;
 
   case 374:
 
-/* Line 1464 of yacc.c  */
-#line 4088 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4082 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(List_T*));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].l)));
-    ;}
+    }
     break;
 
   case 375:
 
-/* Line 1464 of yacc.c  */
-#line 4093 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4087 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].l)));
-    ;}
+    }
     break;
 
   case 376:
 
-/* Line 1464 of yacc.c  */
-#line 4100 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4094 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].d)));
-    ;}
+    }
     break;
 
   case 377:
 
-/* Line 1464 of yacc.c  */
-#line 4105 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4099 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
-    ;}
+    }
     break;
 
   case 378:
 
-/* Line 1464 of yacc.c  */
-#line 4109 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4103 "Gmsh.y"
     {
       // creates an empty list
       (yyval.l) = List_Create(2, 1, sizeof(double));
-    ;}
+    }
     break;
 
   case 379:
 
-/* Line 1464 of yacc.c  */
-#line 4114 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4108 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (3)].l);
-    ;}
+    }
     break;
 
   case 380:
 
-/* Line 1464 of yacc.c  */
-#line 4118 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4112 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (4)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
 	double *pd = (double*)List_Pointer((yyval.l), i);
 	(*pd) = - (*pd);
       }
-    ;}
+    }
     break;
 
   case 381:
 
-/* Line 1464 of yacc.c  */
-#line 4126 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4120 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(4) - (5)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
 	double *pd = (double*)List_Pointer((yyval.l), i);
 	(*pd) *= (yyvsp[(1) - (5)].d);
       }
-    ;}
+    }
     break;
 
   case 382:
 
-/* Line 1464 of yacc.c  */
-#line 4137 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4131 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
-    ;}
+    }
     break;
 
   case 383:
 
-/* Line 1464 of yacc.c  */
-#line 4141 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4135 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (1)].c), "*") || !strcmp((yyvsp[(1) - (1)].c), "all"))
         (yyval.l) = 0;
@@ -9644,51 +9660,51 @@ yyreduce:
         yyerror("Unknown special string for list replacement");
         (yyval.l) = List_Create(2, 1, sizeof(double));
       }
-    ;}
+    }
     break;
 
   case 384:
 
-/* Line 1464 of yacc.c  */
-#line 4153 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4147 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (2)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
 	double *pd = (double*)List_Pointer((yyval.l), i);
 	(*pd) = - (*pd);
       }
-    ;}
+    }
     break;
 
   case 385:
 
-/* Line 1464 of yacc.c  */
-#line 4161 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4155 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (3)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
 	double *pd = (double*)List_Pointer((yyval.l), i);
 	(*pd) *= (yyvsp[(1) - (3)].d);
       }
-    ;}
+    }
     break;
 
   case 386:
 
-/* Line 1464 of yacc.c  */
-#line 4169 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4163 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       for(double d = (yyvsp[(1) - (3)].d); ((yyvsp[(1) - (3)].d) < (yyvsp[(3) - (3)].d)) ? (d <= (yyvsp[(3) - (3)].d)) : (d >= (yyvsp[(3) - (3)].d));
           ((yyvsp[(1) - (3)].d) < (yyvsp[(3) - (3)].d)) ? (d += 1.) : (d -= 1.))
 	List_Add((yyval.l), &d);
-    ;}
+    }
     break;
 
   case 387:
 
-/* Line 1464 of yacc.c  */
-#line 4176 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4170 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!(yyvsp[(5) - (5)].d) || ((yyvsp[(1) - (5)].d) < (yyvsp[(3) - (5)].d) && (yyvsp[(5) - (5)].d) < 0) || ((yyvsp[(1) - (5)].d) > (yyvsp[(3) - (5)].d) && (yyvsp[(5) - (5)].d) > 0)){
@@ -9698,13 +9714,13 @@ yyreduce:
       else
 	for(double d = (yyvsp[(1) - (5)].d); ((yyvsp[(5) - (5)].d) > 0) ? (d <= (yyvsp[(3) - (5)].d)) : (d >= (yyvsp[(3) - (5)].d)); d += (yyvsp[(5) - (5)].d))
 	  List_Add((yyval.l), &d);
-   ;}
+   }
     break;
 
   case 388:
 
-/* Line 1464 of yacc.c  */
-#line 4187 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4181 "Gmsh.y"
     {
       // Returns the coordinates of a point and fills a list with it.
       // This allows to ensure e.g. that relative point positions are
@@ -9723,49 +9739,49 @@ yyreduce:
 	List_Add((yyval.l), &v->Pos.Y);
 	List_Add((yyval.l), &v->Pos.Z);
       }
-    ;}
+    }
     break;
 
   case 389:
 
-/* Line 1464 of yacc.c  */
-#line 4207 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4201 "Gmsh.y"
     {
       (yyval.l) = GetAllEntityNumbers(0);
-    ;}
+    }
     break;
 
   case 390:
 
-/* Line 1464 of yacc.c  */
-#line 4211 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4205 "Gmsh.y"
     {
       (yyval.l) = GetAllEntityNumbers(1);
-    ;}
+    }
     break;
 
   case 391:
 
-/* Line 1464 of yacc.c  */
-#line 4215 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4209 "Gmsh.y"
     {
       (yyval.l) = GetAllEntityNumbers(2);
-    ;}
+    }
     break;
 
   case 392:
 
-/* Line 1464 of yacc.c  */
-#line 4219 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4213 "Gmsh.y"
     {
       (yyval.l) = GetAllEntityNumbers(3);
-    ;}
+    }
     break;
 
   case 393:
 
-/* Line 1464 of yacc.c  */
-#line 4223 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4217 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){
@@ -9782,13 +9798,13 @@ yyreduce:
         }
       }
       List_Delete((yyvsp[(4) - (5)].l));
-    ;}
+    }
     break;
 
   case 394:
 
-/* Line 1464 of yacc.c  */
-#line 4241 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4235 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){
@@ -9805,13 +9821,13 @@ yyreduce:
         }
       }
       List_Delete((yyvsp[(4) - (5)].l));
-    ;}
+    }
     break;
 
   case 395:
 
-/* Line 1464 of yacc.c  */
-#line 4259 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4253 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){
@@ -9828,13 +9844,13 @@ yyreduce:
         }
       }
       List_Delete((yyvsp[(4) - (5)].l));
-    ;}
+    }
     break;
 
   case 396:
 
-/* Line 1464 of yacc.c  */
-#line 4277 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4271 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){
@@ -9851,13 +9867,13 @@ yyreduce:
         }
       }
       List_Delete((yyvsp[(4) - (5)].l));
-    ;}
+    }
     break;
 
   case 397:
 
-/* Line 1464 of yacc.c  */
-#line 4295 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4289 "Gmsh.y"
     {
       (yyval.l) = List_Create(List_Nbr((yyvsp[(1) - (1)].l)), 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(1) - (1)].l)); i++){
@@ -9866,13 +9882,13 @@ yyreduce:
 	List_Add((yyval.l), &d);
       }
       List_Delete((yyvsp[(1) - (1)].l));
-    ;}
+    }
     break;
 
   case 398:
 
-/* Line 1464 of yacc.c  */
-#line 4305 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4299 "Gmsh.y"
     {
       (yyval.l) = List_Create(List_Nbr((yyvsp[(1) - (1)].l)), 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(1) - (1)].l)); i++){
@@ -9881,13 +9897,13 @@ yyreduce:
 	List_Add((yyval.l), &d);
       }
       List_Delete((yyvsp[(1) - (1)].l));
-    ;}
+    }
     break;
 
   case 399:
 
-/* Line 1464 of yacc.c  */
-#line 4315 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4309 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (3)].c)))
@@ -9898,13 +9914,13 @@ yyreduce:
 	  List_Add((yyval.l), &s.value[i]);
       }
       Free((yyvsp[(1) - (3)].c));
-    ;}
+    }
     break;
 
   case 400:
 
-/* Line 1464 of yacc.c  */
-#line 4327 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4321 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(3) - (4)].c)))
@@ -9915,13 +9931,13 @@ yyreduce:
 	  List_Add((yyval.l), &s.value[i]);
       }
       Free((yyvsp[(3) - (4)].c));
-    ;}
+    }
     break;
 
   case 401:
 
-/* Line 1464 of yacc.c  */
-#line 4339 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4333 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (6)].c)))
@@ -9938,41 +9954,41 @@ yyreduce:
       }
       Free((yyvsp[(1) - (6)].c));
       List_Delete((yyvsp[(4) - (6)].l));
-    ;}
+    }
     break;
 
   case 402:
 
-/* Line 1464 of yacc.c  */
-#line 4360 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4354 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].d)));
-    ;}
+    }
     break;
 
   case 403:
 
-/* Line 1464 of yacc.c  */
-#line 4365 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4359 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
-    ;}
+    }
     break;
 
   case 404:
 
-/* Line 1464 of yacc.c  */
-#line 4369 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4363 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].d)));
-    ;}
+    }
     break;
 
   case 405:
 
-/* Line 1464 of yacc.c  */
-#line 4373 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4367 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (3)].l)); i++){
 	double d;
@@ -9980,64 +9996,64 @@ yyreduce:
 	List_Add((yyval.l), &d);
       }
       List_Delete((yyvsp[(3) - (3)].l));
-    ;}
+    }
     break;
 
   case 406:
 
-/* Line 1464 of yacc.c  */
-#line 4385 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4379 "Gmsh.y"
     {
       (yyval.u) = CTX::instance()->packColor((int)(yyvsp[(2) - (9)].d), (int)(yyvsp[(4) - (9)].d), (int)(yyvsp[(6) - (9)].d), (int)(yyvsp[(8) - (9)].d));
-    ;}
+    }
     break;
 
   case 407:
 
-/* Line 1464 of yacc.c  */
-#line 4389 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4383 "Gmsh.y"
     {
       (yyval.u) = CTX::instance()->packColor((int)(yyvsp[(2) - (7)].d), (int)(yyvsp[(4) - (7)].d), (int)(yyvsp[(6) - (7)].d), 255);
-    ;}
+    }
     break;
 
   case 408:
 
-/* Line 1464 of yacc.c  */
-#line 4401 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4395 "Gmsh.y"
     {
       int flag;
       (yyval.u) = GetColorForString(-1, (yyvsp[(1) - (1)].c), &flag);
       if(flag) yymsg(0, "Unknown color '%s'", (yyvsp[(1) - (1)].c));
       Free((yyvsp[(1) - (1)].c));
-    ;}
+    }
     break;
 
   case 409:
 
-/* Line 1464 of yacc.c  */
-#line 4408 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4402 "Gmsh.y"
     {
       unsigned int val = 0;
       ColorOption(GMSH_GET, (yyvsp[(1) - (5)].c), 0, (yyvsp[(5) - (5)].c), val);
       (yyval.u) = val;
       Free((yyvsp[(1) - (5)].c)); Free((yyvsp[(5) - (5)].c));
-    ;}
+    }
     break;
 
   case 410:
 
-/* Line 1464 of yacc.c  */
-#line 4418 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4412 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (3)].l);
-    ;}
+    }
     break;
 
   case 411:
 
-/* Line 1464 of yacc.c  */
-#line 4422 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4416 "Gmsh.y"
     {
       (yyval.l) = List_Create(256, 10, sizeof(unsigned int));
       GmshColorTable *ct = GetColorTable((int)(yyvsp[(3) - (6)].d));
@@ -10048,41 +10064,41 @@ yyreduce:
 	  List_Add((yyval.l), &ct->table[i]);
       }
       Free((yyvsp[(1) - (6)].c));
-    ;}
+    }
     break;
 
   case 412:
 
-/* Line 1464 of yacc.c  */
-#line 4437 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4431 "Gmsh.y"
     {
       (yyval.l) = List_Create(256, 10, sizeof(unsigned int));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].u)));
-    ;}
+    }
     break;
 
   case 413:
 
-/* Line 1464 of yacc.c  */
-#line 4442 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4436 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].u)));
-    ;}
+    }
     break;
 
   case 414:
 
-/* Line 1464 of yacc.c  */
-#line 4449 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4443 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(1) - (1)].c);
-    ;}
+    }
     break;
 
   case 415:
 
-/* Line 1464 of yacc.c  */
-#line 4453 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4447 "Gmsh.y"
     {
       if(!gmsh_yystringsymbols.count((yyvsp[(1) - (1)].c))){
 	yymsg(0, "Unknown string variable '%s'", (yyvsp[(1) - (1)].c));
@@ -10094,100 +10110,100 @@ yyreduce:
 	strcpy((yyval.c), val.c_str());
 	Free((yyvsp[(1) - (1)].c));
       }
-    ;}
+    }
     break;
 
   case 416:
 
-/* Line 1464 of yacc.c  */
-#line 4466 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4460 "Gmsh.y"
     {
       std::string out;
       StringOption(GMSH_GET, (yyvsp[(1) - (3)].c), 0, (yyvsp[(3) - (3)].c), out);
       (yyval.c) = (char*)Malloc((out.size() + 1) * sizeof(char));
       strcpy((yyval.c), out.c_str());
       Free((yyvsp[(1) - (3)].c)); Free((yyvsp[(3) - (3)].c));
-    ;}
+    }
     break;
 
   case 417:
 
-/* Line 1464 of yacc.c  */
-#line 4474 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4468 "Gmsh.y"
     {
       std::string out;
       StringOption(GMSH_GET, (yyvsp[(1) - (6)].c), (int)(yyvsp[(3) - (6)].d), (yyvsp[(6) - (6)].c), out);
       (yyval.c) = (char*)Malloc((out.size() + 1) * sizeof(char));
       strcpy((yyval.c), out.c_str());
       Free((yyvsp[(1) - (6)].c)); Free((yyvsp[(6) - (6)].c));
-    ;}
+    }
     break;
 
   case 418:
 
-/* Line 1464 of yacc.c  */
-#line 4485 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4479 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(1) - (1)].c);
-    ;}
+    }
     break;
 
   case 419:
 
-/* Line 1464 of yacc.c  */
-#line 4489 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4483 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc(32 * sizeof(char));
       time_t now;
       time(&now);
       strcpy((yyval.c), ctime(&now));
       (yyval.c)[strlen((yyval.c)) - 1] = '\0';
-    ;}
+    }
     break;
 
   case 420:
 
-/* Line 1464 of yacc.c  */
-#line 4497 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4491 "Gmsh.y"
     {
       const char *env = GetEnvironmentVar((yyvsp[(3) - (4)].c));
       if(!env) env = "";
       (yyval.c) = (char *)Malloc((sizeof(env) + 1) * sizeof(char));
       strcpy((yyval.c), env);
       Free((yyvsp[(3) - (4)].c));
-    ;}
+    }
     break;
 
   case 421:
 
-/* Line 1464 of yacc.c  */
-#line 4505 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4499 "Gmsh.y"
     {
       std::string s = Msg::GetString((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].c));
       (yyval.c) = (char *)Malloc((s.size() + 1) * sizeof(char));
       strcpy((yyval.c), s.c_str());
       Free((yyvsp[(3) - (6)].c));
       Free((yyvsp[(5) - (6)].c));
-    ;}
+    }
     break;
 
   case 422:
 
-/* Line 1464 of yacc.c  */
-#line 4513 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4507 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (6)].c)) + strlen((yyvsp[(5) - (6)].c)) + 1) * sizeof(char));
       strcpy((yyval.c), (yyvsp[(3) - (6)].c));
       strcat((yyval.c), (yyvsp[(5) - (6)].c));
       Free((yyvsp[(3) - (6)].c));
       Free((yyvsp[(5) - (6)].c));
-    ;}
+    }
     break;
 
   case 423:
 
-/* Line 1464 of yacc.c  */
-#line 4521 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4515 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c)) + 1) * sizeof(char));
       int i;
@@ -10200,13 +10216,13 @@ yyreduce:
       }
       if(i <= 0) strcpy((yyval.c), (yyvsp[(3) - (4)].c));
       Free((yyvsp[(3) - (4)].c));
-    ;}
+    }
     break;
 
   case 424:
 
-/* Line 1464 of yacc.c  */
-#line 4535 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4529 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c)) + 1) * sizeof(char));
       int i;
@@ -10219,22 +10235,22 @@ yyreduce:
       else
 	strcpy((yyval.c), &(yyvsp[(3) - (4)].c)[i+1]);
       Free((yyvsp[(3) - (4)].c));
-    ;}
+    }
     break;
 
   case 425:
 
-/* Line 1464 of yacc.c  */
-#line 4549 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4543 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(3) - (4)].c);
-    ;}
+    }
     break;
 
   case 426:
 
-/* Line 1464 of yacc.c  */
-#line 4553 "Gmsh.y"
+/* Line 1806 of yacc.c  */
+#line 4547 "Gmsh.y"
     {
       char tmpstring[5000];
       int i = PrintListOfDouble((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].l), tmpstring);
@@ -10252,15 +10268,26 @@ yyreduce:
 	Free((yyvsp[(3) - (6)].c));
       }
       List_Delete((yyvsp[(5) - (6)].l));
-    ;}
+    }
     break;
 
 
 
-/* Line 1464 of yacc.c  */
-#line 10262 "Gmsh.tab.cpp"
+/* Line 1806 of yacc.c  */
+#line 10278 "Gmsh.tab.cpp"
       default: break;
     }
+  /* User semantic actions sometimes alter yychar, and that requires
+     that yytoken be updated with the new translation.  We take the
+     approach of translating immediately before every use of yytoken.
+     One alternative is translating here after every semantic action,
+     but that translation would be missed if the semantic action invokes
+     YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
+     if it invokes YYBACKUP.  In the case of YYABORT or YYACCEPT, an
+     incorrect destructor might then be invoked immediately.  In the
+     case of YYERROR or YYBACKUP, subsequent parser actions might lead
+     to an incorrect destructor call or verbose syntax error message
+     before the lookahead is translated.  */
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
 
   YYPOPSTACK (yylen);
@@ -10288,6 +10315,10 @@ yyreduce:
 | yyerrlab -- here on detecting error |
 `------------------------------------*/
 yyerrlab:
+  /* Make sure we have latest lookahead translation.  See comments at
+     user semantic actions for why this is necessary.  */
+  yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
+
   /* If not already recovering from an error, report this error.  */
   if (!yyerrstatus)
     {
@@ -10295,37 +10326,36 @@ yyerrlab:
 #if ! YYERROR_VERBOSE
       yyerror (YY_("syntax error"));
 #else
+# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \
+                                        yyssp, yytoken)
       {
-	YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
-	if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
-	  {
-	    YYSIZE_T yyalloc = 2 * yysize;
-	    if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
-	      yyalloc = YYSTACK_ALLOC_MAXIMUM;
-	    if (yymsg != yymsgbuf)
-	      YYSTACK_FREE (yymsg);
-	    yymsg = (char *) YYSTACK_ALLOC (yyalloc);
-	    if (yymsg)
-	      yymsg_alloc = yyalloc;
-	    else
-	      {
-		yymsg = yymsgbuf;
-		yymsg_alloc = sizeof yymsgbuf;
-	      }
-	  }
-
-	if (0 < yysize && yysize <= yymsg_alloc)
-	  {
-	    (void) yysyntax_error (yymsg, yystate, yychar);
-	    yyerror (yymsg);
-	  }
-	else
-	  {
-	    yyerror (YY_("syntax error"));
-	    if (yysize != 0)
-	      goto yyexhaustedlab;
-	  }
+        char const *yymsgp = YY_("syntax error");
+        int yysyntax_error_status;
+        yysyntax_error_status = YYSYNTAX_ERROR;
+        if (yysyntax_error_status == 0)
+          yymsgp = yymsg;
+        else if (yysyntax_error_status == 1)
+          {
+            if (yymsg != yymsgbuf)
+              YYSTACK_FREE (yymsg);
+            yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc);
+            if (!yymsg)
+              {
+                yymsg = yymsgbuf;
+                yymsg_alloc = sizeof yymsgbuf;
+                yysyntax_error_status = 2;
+              }
+            else
+              {
+                yysyntax_error_status = YYSYNTAX_ERROR;
+                yymsgp = yymsg;
+              }
+          }
+        yyerror (yymsgp);
+        if (yysyntax_error_status == 2)
+          goto yyexhaustedlab;
       }
+# undef YYSYNTAX_ERROR
 #endif
     }
 
@@ -10384,7 +10414,7 @@ yyerrlab1:
   for (;;)
     {
       yyn = yypact[yystate];
-      if (yyn != YYPACT_NINF)
+      if (!yypact_value_is_default (yyn))
 	{
 	  yyn += YYTERROR;
 	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
@@ -10443,8 +10473,13 @@ yyexhaustedlab:
 
 yyreturn:
   if (yychar != YYEMPTY)
-     yydestruct ("Cleanup: discarding lookahead",
-		 yytoken, &yylval);
+    {
+      /* Make sure we have latest lookahead translation.  See comments at
+         user semantic actions for why this is necessary.  */
+      yytoken = YYTRANSLATE (yychar);
+      yydestruct ("Cleanup: discarding lookahead",
+                  yytoken, &yylval);
+    }
   /* Do not reclaim the symbols of the rule which action triggered
      this YYABORT or YYACCEPT.  */
   YYPOPSTACK (yylen);
@@ -10469,8 +10504,8 @@ yyreturn:
 
 
 
-/* Line 1684 of yacc.c  */
-#line 4573 "Gmsh.y"
+/* Line 2067 of yacc.c  */
+#line 4567 "Gmsh.y"
 
 
 int PrintListOfDouble(char *format, List_T *list, char *buffer)
diff --git a/Parser/Gmsh.tab.hpp b/Parser/Gmsh.tab.hpp
index a8069b2a137fc824d3b96fdc7928a12293dfba6c..183f2c8754e87754af909d0f212fe36d5aaaf0f0 100644
--- a/Parser/Gmsh.tab.hpp
+++ b/Parser/Gmsh.tab.hpp
@@ -1,9 +1,8 @@
-/* A Bison parser, made by GNU Bison 2.4.3.  */
+/* A Bison parser, made by GNU Bison 2.5.  */
 
-/* Skeleton interface for Bison's Yacc-like parsers in C
+/* Bison interface for Yacc-like parsers in C
    
-      Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
-   2009, 2010 Free Software Foundation, Inc.
+      Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -184,7 +183,7 @@
 typedef union YYSTYPE
 {
 
-/* Line 1685 of yacc.c  */
+/* Line 2068 of yacc.c  */
 #line 92 "Gmsh.y"
 
   char *c;
@@ -197,8 +196,8 @@ typedef union YYSTYPE
 
 
 
-/* Line 1685 of yacc.c  */
-#line 202 "Gmsh.tab.hpp"
+/* Line 2068 of yacc.c  */
+#line 201 "Gmsh.tab.hpp"
 } YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
index 194bcedec336953a49e8208e2ad6bedaf0444356..3984e1b50756a1a0f5c88a0a61eb2def0c03b423 100644
--- a/Parser/Gmsh.y
+++ b/Parser/Gmsh.y
@@ -3746,8 +3746,6 @@ Homology :
     HomologyCommand tEND
     {
       std::vector<int> domain, subdomain, dim;
-      if(GModel::current()->getDim() != 1) dim.push_back(1);
-      if(GModel::current()->getDim() != 2) dim.push_back(2);
       GModel::current()->addHomologyRequest($1, domain, subdomain, dim);
     }
   | HomologyCommand '{' ListOfDouble '}' tEND
@@ -3758,8 +3756,6 @@ Homology :
         List_Read($3, i, &d);
         domain.push_back((int)d);
       }
-      if(GModel::current()->getDim() != 1) dim.push_back(1);
-      if(GModel::current()->getDim() != 2) dim.push_back(2);
       GModel::current()->addHomologyRequest($1, domain, subdomain, dim);
       List_Delete($3);
     }
@@ -3776,8 +3772,6 @@ Homology :
         List_Read($5, i, &d);
         subdomain.push_back((int)d);
       }
-      if(GModel::current()->getDim() != 1) dim.push_back(1);
-      if(GModel::current()->getDim() != 2) dim.push_back(2);
       GModel::current()->addHomologyRequest($1, domain, subdomain, dim);
       List_Delete($3);
       List_Delete($5);
diff --git a/Parser/Gmsh.yy.cpp b/Parser/Gmsh.yy.cpp
index e1cdbb6b9c4445574bdd385a133035ec7831c8df..51862f0c4cfa2ba097069bc0e468aa7d8966ace2 100644
--- a/Parser/Gmsh.yy.cpp
+++ b/Parser/Gmsh.yy.cpp
@@ -66,7 +66,6 @@ typedef int16_t flex_int16_t;
 typedef uint16_t flex_uint16_t;
 typedef int32_t flex_int32_t;
 typedef uint32_t flex_uint32_t;
-typedef uint64_t flex_uint64_t;
 #else
 typedef signed char flex_int8_t;
 typedef short int flex_int16_t;
@@ -74,7 +73,6 @@ typedef int flex_int32_t;
 typedef unsigned char flex_uint8_t; 
 typedef unsigned short int flex_uint16_t;
 typedef unsigned int flex_uint32_t;
-#endif /* ! C99 */
 
 /* Limits of integral types. */
 #ifndef INT8_MIN
@@ -105,6 +103,8 @@ typedef unsigned int flex_uint32_t;
 #define UINT32_MAX             (4294967295U)
 #endif
 
+#endif /* ! C99 */
+
 #endif /* ! FLEXINT_H */
 
 #ifdef __cplusplus
@@ -161,7 +161,15 @@ typedef unsigned int flex_uint32_t;
 
 /* Size of default input buffer. */
 #ifndef YY_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k.
+ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+ * Ditto for the __ia64__ case accordingly.
+ */
+#define YY_BUF_SIZE 32768
+#else
 #define YY_BUF_SIZE 16384
+#endif /* __ia64__ */
 #endif
 
 /* The state buf must be large enough to hold one state per character in the main buffer.
@@ -173,12 +181,7 @@ typedef unsigned int flex_uint32_t;
 typedef struct yy_buffer_state *YY_BUFFER_STATE;
 #endif
 
-#ifndef YY_TYPEDEF_YY_SIZE_T
-#define YY_TYPEDEF_YY_SIZE_T
-typedef size_t yy_size_t;
-#endif
-
-extern yy_size_t gmsh_yyleng;
+extern int gmsh_yyleng;
 
 extern FILE *gmsh_yyin, *gmsh_yyout;
 
@@ -204,6 +207,11 @@ extern FILE *gmsh_yyin, *gmsh_yyout;
 
 #define unput(c) yyunput( c, (yytext_ptr)  )
 
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
 #ifndef YY_STRUCT_YY_BUFFER_STATE
 #define YY_STRUCT_YY_BUFFER_STATE
 struct yy_buffer_state
@@ -221,7 +229,7 @@ struct yy_buffer_state
 	/* Number of characters read into yy_ch_buf, not including EOB
 	 * characters.
 	 */
-	yy_size_t yy_n_chars;
+	int yy_n_chars;
 
 	/* Whether we "own" the buffer - i.e., we know we created it,
 	 * and can realloc() it to grow it, and should free() it to
@@ -291,8 +299,8 @@ static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
 
 /* yy_hold_char holds the character lost when gmsh_yytext is formed. */
 static char yy_hold_char;
-static yy_size_t yy_n_chars;		/* number of characters read into yy_ch_buf */
-yy_size_t gmsh_yyleng;
+static int yy_n_chars;		/* number of characters read into yy_ch_buf */
+int gmsh_yyleng;
 
 /* Points to current character in buffer. */
 static char *yy_c_buf_p = (char *) 0;
@@ -320,7 +328,7 @@ static void gmsh_yy_init_buffer (YY_BUFFER_STATE b,FILE *file  );
 
 YY_BUFFER_STATE gmsh_yy_scan_buffer (char *base,yy_size_t size  );
 YY_BUFFER_STATE gmsh_yy_scan_string (yyconst char *yy_str  );
-YY_BUFFER_STATE gmsh_yy_scan_bytes (yyconst char *bytes,yy_size_t len  );
+YY_BUFFER_STATE gmsh_yy_scan_bytes (yyconst char *bytes,int len  );
 
 void *gmsh_yyalloc (yy_size_t  );
 void *gmsh_yyrealloc (void *,yy_size_t  );
@@ -375,7 +383,7 @@ static void yy_fatal_error (yyconst char msg[]  );
  */
 #define YY_DO_BEFORE_ACTION \
 	(yytext_ptr) = yy_bp; \
-	gmsh_yyleng = (yy_size_t) (yy_cp - yy_bp); \
+	gmsh_yyleng = (size_t) (yy_cp - yy_bp); \
 	(yy_hold_char) = *yy_cp; \
 	*yy_cp = '\0'; \
 	(yy_c_buf_p) = yy_cp;
@@ -951,7 +959,7 @@ void   skipline(void);
 #define YY_NO_UNISTD_H
 #endif
 
-#line 955 "Gmsh.yy.cpp"
+#line 963 "Gmsh.yy.cpp"
 
 #define INITIAL 0
 
@@ -990,7 +998,7 @@ FILE *gmsh_yyget_out (void );
 
 void gmsh_yyset_out  (FILE * out_str  );
 
-yy_size_t gmsh_yyget_leng (void );
+int gmsh_yyget_leng (void );
 
 char *gmsh_yyget_text (void );
 
@@ -1032,7 +1040,12 @@ static int input (void );
 
 /* Amount of stuff to slurp up with each read. */
 #ifndef YY_READ_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k */
+#define YY_READ_BUF_SIZE 16384
+#else
 #define YY_READ_BUF_SIZE 8192
+#endif /* __ia64__ */
 #endif
 
 /* Copy whatever the last rule matched to the standard output. */
@@ -1040,7 +1053,7 @@ static int input (void );
 /* This used to be an fputs(), but since the string might contain NUL's,
  * we now use fwrite().
  */
-#define ECHO fwrite( gmsh_yytext, gmsh_yyleng, 1, gmsh_yyout )
+#define ECHO do { if (fwrite( gmsh_yytext, gmsh_yyleng, 1, gmsh_yyout )) {} } while (0)
 #endif
 
 /* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
@@ -1051,7 +1064,7 @@ static int input (void );
 	if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
 		{ \
 		int c = '*'; \
-		yy_size_t n; \
+		size_t n; \
 		for ( n = 0; n < max_size && \
 			     (c = getc( gmsh_yyin )) != EOF && c != '\n'; ++n ) \
 			buf[n] = (char) c; \
@@ -1136,7 +1149,7 @@ YY_DECL
 #line 49 "Gmsh.l"
 
 
-#line 1140 "Gmsh.yy.cpp"
+#line 1153 "Gmsh.yy.cpp"
 
 	if ( !(yy_init) )
 		{
@@ -2011,7 +2024,7 @@ YY_RULE_SETUP
 #line 235 "Gmsh.l"
 ECHO;
 	YY_BREAK
-#line 2015 "Gmsh.yy.cpp"
+#line 2028 "Gmsh.yy.cpp"
 case YY_STATE_EOF(INITIAL):
 	yyterminate();
 
@@ -2197,7 +2210,7 @@ static int yy_get_next_buffer (void)
 
 	else
 		{
-			yy_size_t num_to_read =
+			int num_to_read =
 			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
 
 		while ( num_to_read <= 0 )
@@ -2211,7 +2224,7 @@ static int yy_get_next_buffer (void)
 
 			if ( b->yy_is_our_buffer )
 				{
-				yy_size_t new_size = b->yy_buf_size * 2;
+				int new_size = b->yy_buf_size * 2;
 
 				if ( new_size <= 0 )
 					b->yy_buf_size += b->yy_buf_size / 8;
@@ -2242,7 +2255,7 @@ static int yy_get_next_buffer (void)
 
 		/* Read in more data. */
 		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
-			(yy_n_chars), num_to_read );
+			(yy_n_chars), (size_t) num_to_read );
 
 		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
 		}
@@ -2352,7 +2365,7 @@ static int yy_get_next_buffer (void)
 	if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
 		{ /* need to shift things up to make room */
 		/* +2 for EOB chars. */
-		register yy_size_t number_to_move = (yy_n_chars) + 2;
+		register int number_to_move = (yy_n_chars) + 2;
 		register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
 					YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
 		register char *source =
@@ -2401,7 +2414,7 @@ static int yy_get_next_buffer (void)
 
 		else
 			{ /* need more input */
-			yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
+			int offset = (yy_c_buf_p) - (yytext_ptr);
 			++(yy_c_buf_p);
 
 			switch ( yy_get_next_buffer(  ) )
@@ -2425,7 +2438,7 @@ static int yy_get_next_buffer (void)
 				case EOB_ACT_END_OF_FILE:
 					{
 					if ( gmsh_yywrap( ) )
-						return 0;
+						return EOF;
 
 					if ( ! (yy_did_buffer_switch_on_eof) )
 						YY_NEW_FILE;
@@ -2677,7 +2690,7 @@ void gmsh_yypop_buffer_state (void)
  */
 static void gmsh_yyensure_buffer_stack (void)
 {
-	yy_size_t num_to_alloc;
+	int num_to_alloc;
     
 	if (!(yy_buffer_stack)) {
 
@@ -2769,16 +2782,17 @@ YY_BUFFER_STATE gmsh_yy_scan_string (yyconst char * yystr )
 
 /** Setup the input buffer state to scan the given bytes. The next call to gmsh_yylex() will
  * scan from a @e copy of @a bytes.
- * @param bytes the byte buffer to scan
- * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * @param yybytes the byte buffer to scan
+ * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
  * 
  * @return the newly allocated buffer state object.
  */
-YY_BUFFER_STATE gmsh_yy_scan_bytes  (yyconst char * yybytes, yy_size_t  _yybytes_len )
+YY_BUFFER_STATE gmsh_yy_scan_bytes  (yyconst char * yybytes, int  _yybytes_len )
 {
 	YY_BUFFER_STATE b;
 	char *buf;
-	yy_size_t n, i;
+	yy_size_t n;
+	int i;
     
 	/* Get memory for full buffer, including space for trailing EOB's. */
 	n = _yybytes_len + 2;
@@ -2860,7 +2874,7 @@ FILE *gmsh_yyget_out  (void)
 /** Get the length of the current token.
  * 
  */
-yy_size_t gmsh_yyget_leng  (void)
+int gmsh_yyget_leng  (void)
 {
         return gmsh_yyleng;
 }
diff --git a/Plugin/HomologyComputation.cpp b/Plugin/HomologyComputation.cpp
index d7cbaf402ab075a2811bdc37fcf94aaafbbe0967..9d52c8714a0800318f9ed08980208849a713dd47 100644
--- a/Plugin/HomologyComputation.cpp
+++ b/Plugin/HomologyComputation.cpp
@@ -24,7 +24,7 @@ StringXNumber HomologyComputationOptions_Number[] = {
   {GMSH_FULLRC, "CohomologyPhysicalGroupsBegin", NULL, -1.},
   {GMSH_FULLRC, "CreatePostProcessingViews", NULL, 1.},
   {GMSH_FULLRC, "ReductionOmit", NULL, 1.},
-  {GMSH_FULLRC, "ReductionCombine", NULL, 1.},
+  {GMSH_FULLRC, "ReductionCombine", NULL, 2.},
   {GMSH_FULLRC, "PostProcessSmoothen", NULL, 1.}
 };
 
@@ -109,7 +109,7 @@ PView *GMSH_HomologyComputationPlugin::execute(PView *v)
   int cohpg = (int)HomologyComputationOptions_Number[3].def;
   bool pviews = (bool)HomologyComputationOptions_Number[4].def;
   bool omit = (bool)HomologyComputationOptions_Number[5].def;
-  bool combine = (bool)HomologyComputationOptions_Number[6].def;
+  int combine = (int)HomologyComputationOptions_Number[6].def;
   bool smoothen = (bool)HomologyComputationOptions_Number[7].def;
 
   std::vector<int> domain;
@@ -127,8 +127,8 @@ PView *GMSH_HomologyComputationPlugin::execute(PView *v)
                                     true, combine, omit, smoothen);
   homology->setFileName(fileName);
 
-  if(hom != 0) homology->findHomologyBasis();
-  if(coh != 0) homology->findCohomologyBasis();
+  if(hom != 0) homology->findHomologyBasis(dimsave);
+  if(coh != 0) homology->findCohomologyBasis(dimsave);
 
   for(unsigned int i = 0; i < dimsave.size(); i++) {
     int dim = dimsave.at(i);
diff --git a/Plugin/HomologyPostProcessing.cpp b/Plugin/HomologyPostProcessing.cpp
index bc5133ba1dfd806cf70033395d09035417a460dd..72dc4f1095a65a2a9fddab839698ebe27086a8e5 100644
--- a/Plugin/HomologyPostProcessing.cpp
+++ b/Plugin/HomologyPostProcessing.cpp
@@ -40,13 +40,24 @@ extern "C"
 std::string GMSH_HomologyPostProcessingPlugin::getHelp() const
 {
   return "Plugin(HomologyPostProcessing) operates on representative "
-    "basis chains of homology and cohomology spaces.\n\n"
+    "basis chains of homology and cohomology spaces. Functionality:\n\n"
+
+    "1. (co)homology basis transformation:\n "
+    "'TransformationMatrix': Integer matrix of the transformation.\n "
+    "'PhysicalGroupsOfOperatedChains': (Co)chains of a (co)homology space basis to be transformed.\n "
+    "Results a new (co)chain basis that is an integer cobination of the given basis. \n\n"
+
+    "2. Make basis representations of a homology space and a cohomology space "
+    "compatible: \n"
+    "'PhysicalGroupsOfOperatedChains': Chains of a homology space basis.\n"
+    "'PhysicalGroupsOfOperatedChains2': Cochains of a cohomology space basis.\n"
+    "Results a new basis for the homology space such that the incidence matrix of the new basis and the basis of the cohomology space is the identity matrix.\n\n"
+
+    "Options:\n"
+    "'PhysicalGroupsToTraceResults': Trace the resulting cochains to the given physical groups.\n"
+    "'NameForResultChains': Post-processing view name prefix for the results.\n"
+    "'ApplyBoundaryOperatorToResults': Apply boundary operator to the resulting chains.\n";
 
-    "Define the physical groups of chains and their dimension "
-    "to be transformed by the "
-    "given integer transformation matrix. Number of matrix columns must "
-    "equal to the number of chains given. The resulting "
-    "chains are thus integer combinations of the given chains. ";
 }
 
 int GMSH_HomologyPostProcessingPlugin::getNbOptions() const
diff --git a/doc/texinfo/gmsh.texi b/doc/texinfo/gmsh.texi
index 543f84b534727a09a58a4fc5a900fb4e1ad4ba2c..ee1fcfab44bbdf90c9acda45f863fb5729b33b32 100644
--- a/doc/texinfo/gmsh.texi
+++ b/doc/texinfo/gmsh.texi
@@ -3030,16 +3030,18 @@ Sets number of elliptic smoothing steps for the surfaces listed in
 @var{expression-list} (smoothing only applies to transfinite meshes at
 the moment).
 
-@item Homology @{ @{ @var{expression-list} @}, @{ @var{expression-list} @} @};
+@item Homology ( @{ @var{expression-list} @} ) @{ @{ @var{expression-list} @} , @{ @var{expression-list} @} @};
 Compute a basis representation for homology spaces after a mesh has
-been generated. The first @var{expression-list} is a list of physical
-groups that constitute the computation domain. The second
-@var{expression-list} is a list of physical groups that constitute the
-relative subdomain of relative homology computation; if empty,
-absolute homology is computed. Resulting basis representation chains
-are stored as physical groups in the mesh.
-
-@item Cohomology @{ @{ @var{expression-list} @}, @{ @var{expression-list} @} @};
+been generated. The first @var{expression-list} is a list of
+dimensions whose homology bases are computed; if empty, all bases are
+computed. The second @var{expression-list} is a list physical groups
+that constitute the computation domain; if empty, the whole mesh is
+the domain. The third @var{expression-list} is a list of physical
+groups that constitute the relative subdomain of relative homology
+computation; if empty, absolute homology is computed. Resulting basis
+representation chains are stored as physical groups in the mesh.
+
+@item Cohomology ( @{ @var{expression-list} @} ) @{ @{ @var{expression-list} @} , @{ @var{expression-list} @} @};
 Similar to command @code{Homology}, but computes a basis representation
 for cohomology spaces instead.