示例#1
0
void writeToNrrd(float* data, int w, int h, int l, const char *name) {
    char buffer[255];
    // Write the header file
    sprintf(buffer,"%s.nhdr",name);
    std::ofstream fo(buffer, std::ios::binary);
    sprintf(buffer,"%s.raw",name);

    fo << "NRRD0004" << std::endl;
    fo << "# Complete NRRD file format specification at: "<< std::endl;
    fo << "# http://teem.sourceforge.net/nrrd/format.html"<< std::endl;
    fo << "content: resample "<< std::endl;
    fo << "type: float"<< std::endl;
    fo << "dimension: 3"<< std::endl;
    fo << "space: left-posterior-superior"<< std::endl;
    fo << "sizes: " <<w << " " << h << " " << l << std::endl;
    fo << "space directions: (1,0,0) (0,1,0) (0,0,1) "<< std::endl;
    fo << "centerings: cell cell cell"<< std::endl;
    fo << "kinds: domain domain domain"<< std::endl;
    fo << "endian: little"<< std::endl;
    fo << "encoding: raw"<< std::endl;
    fo << "space origin: (0,0,0)"<< std::endl;
    fo << "data file: " << buffer << std::endl;
    fo.close();

    unsigned int len = w * h * l;
    std::ofstream fo1(buffer, std::ios::binary);
    fo1.write((char*)data, len * sizeof(float));
    fo1.close();
}
bool logical_and(T t)
{
	///////////////////////////////////////////////////
	FO1 fo1;
	FO2 fo2;
	///////////////////////////////////////////////////
	return fo1(t) && fo2(t);
	///////////////////////////////////////////////////
}
示例#3
0
void QamTachymeter::drawBackground(QPainter& painter )
{
	float w, h ;		// épaisseur et longueur du trait de graduation

	QColor	black1(15,13,11) ;
	QColor	black2(34,32,27) ;	
	QColor	white(210,200,190) ;
	QColor	red(221,65,57) ;
	QColor	yellow(205,185,83) ;
	QColor	green(101,149,112) ;

    QFont	fo1("arial.ttf", 60 ) ;
    QFont	fo2("arial.ttf", 50 ) ;

	// fond
	
	qfiBackground(painter, m_radius[ROTOR]+ 50, 10 ) ;

	// graduations "Turbine"

	painter.save() ;

	painter.rotate( m_start[TURBINE] ) ;
	
	for ( int i = 0 ; i <= ( m_max[TURBINE] - m_min[TURBINE] ) ; ++i ) {

		if ( i % 10 == 0 ) {		w = 20 ; h = 70 ; }
		else if ( i % 5 == 0 ) {	w = 10 ; h = 60 ; }
		else {						w =  4 ; h = 40 ; }

		qfiMarker(painter, white, m_radius[TURBINE] - 10, QSize( w, h ) ) ;
		
		painter.rotate( m_step[TURBINE] ) ;
	}
	painter.restore() ;
	
	// sérigraphie "Turbine"

	for ( int i = 0 ; i <= ( m_max[TURBINE] - m_min[TURBINE] ) ; i += 10 ) {
		float alpha = qDegreesToRadians( m_start[TURBINE] + i * m_step[TURBINE] ) ;
		float r = m_radius[TURBINE] - 120 ;
		qfiText(painter, fo1, white, QPoint( r * qCos(alpha), r * qSin(alpha) ), QString("%1").arg(i) ) ;
	}
	qfiText(painter, fo1, white, QPoint( 0, 0.8 * m_radius[TURBINE] ), label(TURBINE) ) ;
	qfiText(painter, fo2, white, QPoint( 0, 0.9 * m_radius[TURBINE] ), unit(TURBINE) ) ;

	// seuils "Turbine"	
	
	w = 20 ; h = 90 ;
	
	painter.save() ;
	painter.rotate(m_start[TURBINE] + m_step[TURBINE] * lowThreshold(TURBINE) / 1000 ) ;
	qfiMarker(painter, red, m_radius[TURBINE] - 10, QSize(w, h ) ) ;
	painter.restore() ;
	
	painter.save() ;
	painter.rotate(m_start[TURBINE] + m_step[TURBINE] * highThreshold(TURBINE) / 1000 ) ;
	qfiMarker(painter, red, m_radius[TURBINE] - 10, QSize(w, h ) ) ;
	painter.restore() ;

	// zones colorées "Turbine"

	float radius = m_radius[TURBINE] - 80 ; 
	
	float start = m_start[TURBINE] + m_step[TURBINE] * lowThreshold(TURBINE) / 100 + 4 ;
	float span = m_step[TURBINE] * ( ( ( highThreshold(TURBINE) - lowThreshold(TURBINE) ) / 1000 ) / 3 - 0.75 ) ;	
	qfiArc(painter, yellow, radius, start, span, 24 ) ;

	start += span + 4 ;
	span = m_step[TURBINE] * ( ( ( highThreshold(TURBINE) - lowThreshold(TURBINE) ) / 1000 ) / 3 - 0.5 ) ;
	qfiArc(painter, green, radius, start, span, 24 ) ;

	start += span + 4 ;
	span = m_step[TURBINE] * ( ( ( highThreshold(TURBINE) - lowThreshold(TURBINE) ) / 1000 ) / 3 - 0.8 ) ;
	qfiArc(painter, yellow, radius, start, span, 24 ) ;

	// graduations "Rotor"

	painter.save() ;
	
	radius = m_radius[ROTOR] ;
	qfiArc(painter, white, radius, m_start[ROTOR], m_span[ROTOR], 5 ) ;

	QPen pen( white ) ;
	pen.setWidth(1) ;
	painter.setPen( pen ) ;
	painter.setBrush( white ) ;

	painter.rotate( m_start[ROTOR] ) ;
	
	for ( int i = 0 ; i <= ( m_max[ROTOR] - m_min[ROTOR] ) ; ++i ) {

		if ( i % 5 == 0 ) {	w = 10 ; h = 60 ; }
		else {				w =  6 ; h = 40 ; }

		qfiMarker(painter, white, m_radius[ROTOR], QSize(w, h ) ) ;
		
		painter.rotate( m_step[ROTOR] ) ;
	}
	
	painter.restore() ;

	// sérigraphie "Rotor"
		
	for ( int i = 0 ; i <= ( m_max[ROTOR] - m_min[ROTOR] ) ; i += 10 ) {
		float alpha = qDegreesToRadians( m_start[ROTOR] + i * m_step[ROTOR] ) ;
		float r = m_radius[ROTOR] - 90 ;
		qfiText(painter, fo2, white, QPoint( r * qCos(alpha), r * qSin(alpha) ), QString("%1").arg(i/10) ) ;
	}
	qfiText(painter, fo1, white, QPoint( 0,  m_radius[ROTOR] / 4 ), label(ROTOR) ) ;
	qfiText(painter, fo2, white, QPoint( 0, -m_radius[ROTOR] / 4 ), unit(ROTOR) ) ;
	
	// seuils "Rotor"
	
	w = 20 ; h = 100 ;
	
	painter.save() ;
	painter.rotate(m_start[ROTOR] + m_step[ROTOR] * lowThreshold(ROTOR) / 10 ) ;
	qfiMarker(painter, red, m_radius[ROTOR] + 40, QSize(w, h ) ) ;
	painter.restore() ;
	
	painter.save() ;
	painter.rotate(m_start[ROTOR] + m_step[ROTOR] * highThreshold(ROTOR) / 10 ) ;
	qfiMarker(painter, red, m_radius[ROTOR] + 40, QSize(w, h ) ) ;
	painter.restore() ;

	// zones colorées "Rotor"

	radius = m_radius[ROTOR] + 25 ; 
	
	start = m_start[ROTOR] + m_step[ROTOR] * lowThreshold(ROTOR) / 10 + 5 ;
	span = m_step[ROTOR] * 3.5 ;
	qfiArc(painter, yellow, radius, start, span, 24 ) ;

	start += span + 5 ;
	span = m_step[ROTOR] * ( ( highThreshold(ROTOR) - lowThreshold(ROTOR) ) / 10 - 5.5 ) ;
	qfiArc(painter, green, radius, start, span, 24 ) ;
}
示例#4
0
文件: QHA.cpp 项目: menu-a/llf-snir
void QHA::drawForeground(QPainter& painter )
{
        painter.save();
        qfiBackground(painter, m_radius[QHE], 100) ;
        painter.restore();
    QColor	black1(230,230,230) ;
    QColor	black2(160,160,160) ;
    QColor	yellow(250,250,0) ; //couleur triangle
    QColor  white (250,250,250);
    QFont	fo1("Arial", 100 ) ;
    QFont	fo2("Arial", 50 ) ;
    QColor  bleuexterieur (83,123,216);
    QColor  marronexterieur (76,36,11);
    QColor  bleuinterieur (83,123,216);
    QColor  marroninterieur (76,36,11);

   // fond




        QConicalGradient cg(QPointF(0.0, 0.0), 360 ) ;
        cg.setColorAt(0.0, Qt::white ) ;
        cg.setColorAt(1.0, QColor (139,69,19) ) ;

        //pies bague
        painter.save();
        painter.rotate(0+value(QHE));
        painter.setBrush(bleuexterieur);
                                        //largeur                hauteur              élargie largeur        elargie hauteur
        painter.drawPie             (-0.831*QFI_RADIUS,     -0.83*QFI_RADIUS,       2.075*0.8*QFI_RADIUS,    2.07*0.8*QFI_RADIUS,    16*0,16*180);
        painter.restore();


        painter.save();
        painter.rotate(0+value(QHE));
        painter.setBrush(marronexterieur);
        painter.drawPie               (-0.831*QFI_RADIUS,-0.83*QFI_RADIUS, 2.075*0.8* QFI_RADIUS,   2.08*0.8 * QFI_RADIUS,   16*180,16*180);
        painter.restore();

        //pies rond central




        painter.save();
        painter.rotate(0+value(QHE));
        painter.setBrush(bleuinterieur);
                                  //largeur             hauteur                élargie largeur                 elargie hauteur
        painter.drawPie     (-0.635*QFI_RADIUS,     -0.64*QFI_RADIUS,       1.59*0.8*QFI_RADIUS,           1.61*0.8*QFI_RADIUS,     16*0,16*180);
        painter.restore();


        painter.save();
        painter.rotate(0+value(QHE));
        //painter.translate(60, 60);
        painter.setBrush(marroninterieur);
        painter.drawPie               (-0.635*QFI_RADIUS,-0.63*QFI_RADIUS, 1.59*0.8* QFI_RADIUS,   1.58*0.8 * QFI_RADIUS,      16*180,16*180);
        painter.restore();


painter.save();
painter.rotate(0+value(QHE));
        //triangles
        float w = 0;
        float h = 30;
        float r = 0.64*QFI_RADIUS;
        float hbis = h + 5 ;
        QPolygon    triangle, triangle2, triangle3;


    triangle  << QPoint ( r, 0) << QPoint (r + 1.5 * hbis, - 0.75 * hbis) << QPoint(r + 1.5 * hbis, 0.75* hbis) ;
    triangle2 << QPoint ( r, 0) << QPoint (0.82*QFI_RADIUS, - hbis) << QPoint(0.82*QFI_RADIUS, hbis) ;
    triangle3 << QPoint ( r, 0) << QPoint (0.45*QFI_RADIUS, - hbis) << QPoint(0.45*QFI_RADIUS, hbis );



   painter.save();



// traingle graduation
  painter.rotate(-90);

        for ( int i = 0 ; i < 360 ; ++i) {
            painter.save();
            painter.setBrush(white);
  if (i == 0) painter.drawConvexPolygon(triangle2);
  painter.restore();

  painter.save();
  painter.setBrush(yellow);

  if (i == 0) painter.drawConvexPolygon(triangle3);
  painter.restore();

  painter.save();
  painter.setBrush(white);
   if (i == 45)painter.drawConvexPolygon(triangle);
   if (i == 315)painter.drawConvexPolygon(triangle);// BY AXEL
  painter.restore();

    if (i % 5 == 0)   painter.drawRect(r, 10000, hbis, hbis );
    else if (i % 5 == 0 )   painter.drawEllipse(r, 10000, hbis, hbis);
    else                      qfiMarker(painter, white, r + h, QSize(w, h) ) ;
    painter.rotate(1.0) ;
        }
        painter.restore();



      //2 lignes rond central + ligne d'horiz

        painter.setPen(QPen(Qt::white,3));
        painter.save();
        painter.drawLine(-314, 0, 317, 0);
        painter.rotate(0+value(QHE2));
         painter.restore();

        painter.drawLine(-45, -150, 45, -150); //1 ligne (P)
        painter.drawLine(-45, -100, 45, -100); //2 ligne (P)



    // graduations
        painter.save() ;
        painter.rotate(180.0) ;
        QPen pen( Qt::white ) ;
        pen.setWidth(5) ;
        painter.setPen( pen ) ;
        for ( int i = 0 ; i < 31 ; ++i ) {
            int len = ( (i % 5) == 0 ? 90: 0 ) ;
            if (i != 15){
                if (( i== 12) || (i == 13) | (i == 17) || (i == 18 ))
                    len = 45 ;

            if (len != 0)

                painter.drawLine(0.82 * QFI_RADIUS - 90, 0,0.82 * QFI_RADIUS - 90 + len, 0 );
            }
            painter.rotate(6.0) ;
        }
        painter.restore() ;

    }
示例#5
0
// pre: root != NULL
void doParse(ParseNode *root, std::string inFileName, std::string outBaseName)
{
	std::map<std::string, std::string> firstManualToken;
	FaSymbolTable symTab;
	FaRuleIr ruleIr(&symTab);

	// Iterate thru children of start symbol.
	for(ParseNode::iterator_type i = root->begin(); i != root->end(); ++i)
	{
		ParseNode *statement = *i;
		ParseNode *statementHead = *statement->begin();
		std::string statementHeadText = statementHead->getTokenText();
		if(statementHeadText.empty())
		{
			// name "::=" alternate { '|' alternate } ';'
			// name ::= IDENT | "start" ;
			///std::cout << "[name]" << std::endl;
			std::string ruleName = (*statementHead->begin())->getTokenText();
			ParseNode::iterator_type j = statement->begin();
			++j;	// skip ruleName
			++j;	// skip "::="
			for(;;)
			{
				ParseNode *alternate = *j;
				
				parseAlternate(symTab, ruleIr, alternate, ruleName);
				
				++j;	// skip alternate
				if((*j)->getTokenText() != "|")
					break;	// found ';' at end
				++j;	// skip '|'
			}
		}
		else
		if(statementHeadText == "token")
		{
			for(ParseNode::iterator_type j = ++statement->begin(); j != statement->end(); ++j)
			{
				std::string s = (*j)->getTokenText();
				if(s == ";")
					break;
				ruleIr.addToken(s);
			}
		}
		else
		if(statementHeadText == "keyword")
		{
			std::string s1 = (*(++statement->begin()))->getTokenText();
			std::string s2 = (*(++(++statement->begin())))->getTokenText();
			ruleIr.addKeyword(s1, s2);
		}
		else
		if(statementHeadText == "copyright")
		{
			ruleIr.setCopyright(unquote((*(++statement->begin()))->getTokenText()));
		}
		else
		if(statementHeadText == "prefix")
		{
			ruleIr.setPrefix(unquote((*(++statement->begin()))->getTokenText()));
		}
		else
		if(statementHeadText == "manual")
		{
			ParseNode::iterator_type j = ++statement->begin();
			std::string s0 = (*j)->getTokenText();
			++j;
			std::string s1 = unquote((*j)->getTokenText());
			++j;
			ruleIr.addToken(s0);
			firstManualToken[s0] = s1;
			if(s1.empty() || (s1.size() & 1) != 0)
			{
				std::string msg = "invalid manual token definition (both string literals must be nonempty and even in length)";
				throw ParseSpecificError((*i)->getLine(), (*i)->getFile(), msg);
			}
		}
	}
	
	std::string err = ruleIr.convertGrammar();
	if(!err.empty())
	{
		std::cerr << "error: " << inFileName << ": " << err << std::endl;
		throw ParseError();
	}
	
	std::string fn1 = "out_" + outBaseName + "_parser.h";
	std::string fn2 = "out_" + outBaseName + "_header.h";
	std::string fn3 = "out_" + outBaseName + "_lexer.h";
	
	std::ofstream fo1(fn1.c_str());
	ruleIr.writeParser(fo1, fn1);
	std::ofstream fo2(fn2.c_str());
	ruleIr.writeHeader(fo2, fn2);
	std::ofstream fo3(fn3.c_str());
	ruleIr.writeLexer(fo3, fn3, firstManualToken);
}
示例#6
0
int main()
{
	FaSymbolTable symTab;
	FaRuleIr ruleIr(&symTab);
	
	ruleIr.setCopyright("Copyright (C) 2009 Willow Schlanger");
	ruleIr.setPrefix("rc");
	ruleIr.addToken("IDENT");
	ruleIr.addToken("LITCHAR");
	ruleIr.addToken("LITSTRING");
	ruleIr.addKeyword("\"::=\"", "ISDEFAS");
	
	// 'start' symbol.
	{
		FaNfa *fa;
		bool ok;
		
		unsigned q1;
		fa = ruleIr.addProduction("start", q1);
		unsigned q2 = ruleIr.addState(*fa);
		ruleIr.makeFinal(*fa, q2);

		ok = ruleIr.addEdge(*fa, q1, q2, "statement");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		ok = ruleIr.addEdge(*fa, q2, q2, "statement");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
	}
	
	// 'statement' symbol.
	{
		FaNfa *fa;
		bool ok;

		unsigned q1;
		fa = ruleIr.addProduction("statement", q1);
		unsigned q2 = ruleIr.addState(*fa);
		unsigned q3 = ruleIr.addState(*fa);
		unsigned q4 = ruleIr.addState(*fa);
		ruleIr.makeFinal(*fa, q4);
		ok = ruleIr.addEdge(*fa, q1, q2, "\"token\"");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		ok = ruleIr.addEdge(*fa, q2, q3, "IDENT");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		ok = ruleIr.addEdge(*fa, q3, q3, "IDENT");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		ok = ruleIr.addEdge(*fa, q3, q4, "';'");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		
		unsigned q10;
		fa = ruleIr.addProduction("statement", q10);
		unsigned q11 = ruleIr.addState(*fa);
		unsigned q12 = ruleIr.addState(*fa);
		unsigned q13 = ruleIr.addState(*fa);
		unsigned q14 = ruleIr.addState(*fa);
		ruleIr.makeFinal(*fa, q14);
		ok = ruleIr.addEdge(*fa, q10, q11, "name");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		ok = ruleIr.addEdge(*fa, q11, q12, "\"::=\"");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		ok = ruleIr.addEdge(*fa, q12, q13, "alternate");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		ok = ruleIr.addEdge(*fa, q13, q12, "'|'");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		ok = ruleIr.addEdge(*fa, q13, q14, "';'");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		
		unsigned q20;
		fa = ruleIr.addProduction("statement", q20);
		unsigned q21 = ruleIr.addState(*fa);
		unsigned q22 = ruleIr.addState(*fa);
		unsigned q23 = ruleIr.addState(*fa);
		unsigned q24 = ruleIr.addState(*fa);
		ruleIr.makeFinal(*fa, q24);
		ok = ruleIr.addEdge(*fa, q20, q21, "\"keyword\"");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		ok = ruleIr.addEdge(*fa, q21, q22, "LITSTRING");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		ok = ruleIr.addEdge(*fa, q22, q23, "IDENT");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		ok = ruleIr.addEdge(*fa, q23, q24, "';'");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		
		unsigned q30;
		fa = ruleIr.addProduction("statement", q30);
		unsigned q31 = ruleIr.addState(*fa);
		unsigned q32 = ruleIr.addState(*fa);
		ruleIr.makeFinal(*fa, q32);
		ok = ruleIr.addEdge(*fa, q30, q31, "\"copyright\"");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		ok = ruleIr.addEdge(*fa, q31, q32, "LITSTRING");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		
		unsigned q40;
		fa = ruleIr.addProduction("statement", q40);
		unsigned q41 = ruleIr.addState(*fa);
		unsigned q42 = ruleIr.addState(*fa);
		ruleIr.makeFinal(*fa, q42);
		ok = ruleIr.addEdge(*fa, q40, q41, "\"prefix\"");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		ok = ruleIr.addEdge(*fa, q41, q42, "LITSTRING");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
	}
	
	// 'name' symbol.
	{
		FaNfa *fa;
		bool ok;
		
		unsigned q1;
		fa = ruleIr.addProduction("name", q1);
		unsigned q2 = ruleIr.addState(*fa);
		ruleIr.makeFinal(*fa, q2);
		ok = ruleIr.addEdge(*fa, q1, q2, "IDENT");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		ok = ruleIr.addEdge(*fa, q1, q2, "\"start\"");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
	}
	
	// 'alternate' symbol.
	{
		FaNfa *fa;
		bool ok;
		
		unsigned q1;
		fa = ruleIr.addProduction("alternate", q1);
		unsigned q2 = ruleIr.addState(*fa);
		ruleIr.makeFinal(*fa, q2);
		ok = ruleIr.addEdge(*fa, q1, q2, "symbol");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		ok = ruleIr.addEdge(*fa, q2, q2, "symbol");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
	}
	
	// 'symbol' symbol.
	{
		FaNfa *fa;
		bool ok;
		
		unsigned q1;
		fa = ruleIr.addProduction("symbol", q1);
		unsigned q2 = ruleIr.addState(*fa);
		unsigned q3 = ruleIr.addState(*fa);
		unsigned q4 = ruleIr.addState(*fa);
		unsigned q5 = ruleIr.addState(*fa);
		unsigned q6 = ruleIr.addState(*fa);
		unsigned q7 = ruleIr.addState(*fa);
		unsigned q8 = ruleIr.addState(*fa);
		ruleIr.makeFinal(*fa, q2);
		ruleIr.makeFinal(*fa, q5);
		ruleIr.makeFinal(*fa, q8);
		ok = ruleIr.addEdge(*fa, q1, q2, "item");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		ok = ruleIr.addEdge(*fa, q1, q3, "'{'");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		ok = ruleIr.addEdge(*fa, q3, q4, "alternate");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		ok = ruleIr.addEdge(*fa, q4, q5, "'}'");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		ok = ruleIr.addEdge(*fa, q1, q6, "'['");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		ok = ruleIr.addEdge(*fa, q6, q7, "alternate");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		ok = ruleIr.addEdge(*fa, q7, q8, "']'");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
	}

	// 'item' symbol.
	{
		FaNfa *fa;
		bool ok;
		
		unsigned q1;
		fa = ruleIr.addProduction("item", q1);
		unsigned q2 = ruleIr.addState(*fa);
		ruleIr.makeFinal(*fa, q2);
		ok = ruleIr.addEdge(*fa, q1, q2, "LITCHAR");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		ok = ruleIr.addEdge(*fa, q1, q2, "LITSTRING");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
		ok = ruleIr.addEdge(*fa, q1, q2, "IDENT");
		if(!ok) { std::cerr << "Error on line " << __LINE__ << std::endl; return 0; }
	}
	
	std::string err;
	err = ruleIr.convertGrammar();
	
	if(!err.empty())
	{
		std::cerr << "bootstrap grammar error: " << err << std::endl;
		return 1;
	}
	
	std::ofstream fo1("out_rulecom_parser.h");
	std::ofstream fo2("out_rulecom_header.h");
	ruleIr.writeParser(fo1, "out_rulecom_parser.h");
	ruleIr.writeHeader(fo2, "out_rulecom_header.h");
	
	return 0;
}