Exemple #1
0
bool search(iterator first_, iterator second_, const lsm &lsm_,
    const sm_type &gsm_)
{
    typedef lexertl::iterator<iterator, lsm, lexertl::
        match_results<iterator> > lex_iterator;
    lex_iterator iter_(first_, second_, lsm_);
    lex_iterator end_;

    return search(gsm_, iter_, end_);
}
Exemple #2
0
void lex_prop_list()
{
    lexertl::rules rules_;
    lexertl::state_machine state_machine_;
    std::ifstream if_("PropList.txt");
    lexertl::stream_shared_iterator iter_(if_);
    lexertl::stream_shared_iterator end_;
    lexertl::match_results<lexertl::stream_shared_iterator>
        results_(iter_, end_);
    enum {eRange = 1, eName, eShortName};

    rules_.push_state("RANGE");
    rules_.push_state("WS");
    rules_.push_state("NAME");
    rules_.push_state("SHORT_NAME");
    rules_.push_state("FINISH");
    rules_.push("^#.*", rules_.skip());
    rules_.push("\n", rules_.skip());
    rules_.push("INITIAL", "^[0-9A-F]+(\\.\\.[0-9A-F]+)?", eRange, "RANGE");
    rules_.push("RANGE", " *; ", rules_.skip(), "NAME");
    rules_.push("NAME", "[A-Z][a-zA-Z_]+", eName, "WS");
    rules_.push("WS", " # ", rules_.skip(), "SHORT_NAME");
    rules_.push("SHORT_NAME", "[A-Z][a-z&]", eShortName, "FINISH");
    rules_.push("FINISH", ".*\n", rules_.skip(), "INITIAL");
    lexertl::generator::build(rules_, state_machine_);

    do
    {
        lexertl::lookup(state_machine_, results_);
        std::cout << "Id: " << results_.id << ", Token: '" <<
            std::string(results_.start, results_.end) << "'\n";

        if (results_.id > eShortName)
        {
//            int i = 0;
        }
    } while (results_.id != 0);
}
Exemple #3
0
void case_mapping()
{
    lexertl::rules rules_;
    lexertl::state_machine sm_;
    std::ifstream if_("UnicodeData.txt");
    lexertl::stream_shared_iterator iter_(if_);
    lexertl::stream_shared_iterator end_;
    lexertl::match_results<lexertl::stream_shared_iterator>
        results_(iter_, end_);
    enum e_Token {eEOF, eCodeValue, eName, eLl, eLu, eNeither, eMapping, eEmpty};
    e_Token eToken = eEOF;
    std::string code_;
    std::string mapping_;
    int count_ = 0;


    rules_.push_state("NAME");
    rules_.push_state("TYPE");
    rules_.push_state("Ll");
    rules_.push_state("Lu");
    rules_.push_state("MAPPING");
    rules_.push_state("END");

    rules_.push("INITIAL", "^[0-9A-F]{4,6};", eCodeValue, "NAME");
    rules_.push("NAME", "[^;]*;", sm_.skip(), "TYPE");
    rules_.push("TYPE", "Ll;", eLl, "Ll");
    rules_.push("Ll", "([^;]*;){9}", sm_.skip(), "MAPPING");
    rules_.push("TYPE", "Lu;", eLu, "Lu");
    rules_.push("Lu", "([^;]*;){10}", sm_.skip(), "MAPPING");
    rules_.push("TYPE", "[^;]*;", eNeither, "END");
    rules_.push("MAPPING", ";", eEmpty, "END");
    rules_.push("MAPPING", "[0-9A-F]{4,6};", eMapping, "END");
    rules_.push("END", "[^\n]*\n", sm_.skip(), "INITIAL");
    lexertl::generator::build(rules_, sm_);

    do
    {
        lexertl::lookup(sm_, results_);
        eToken = static_cast<e_Token>(results_.id);

        if (eToken == eEOF)
        {
            break;
        }
        else if (eToken != eCodeValue)
        {
            throw std::runtime_error("Syntax error");
        }

        code_.assign(results_.start, results_.end);
        lexertl::lookup(sm_, results_);
        eToken = static_cast<e_Token>(results_.id);

        if (eToken != eLl && eToken != eLu && eToken != eNeither)
        {
            throw std::runtime_error("Syntax error");
        }

        if (eToken != eNeither)
        {
            lexertl::lookup(sm_, results_);
            eToken = static_cast<e_Token>(results_.id);

            if (eToken == eMapping)
            {
                mapping_.assign(results_.start, results_.end);
                std::cout << "(0x" << code_.substr(0, code_.size() - 1) << ", " <<
                    "0x" << mapping_.substr(0, mapping_.size() - 1) << "), ";
                code_.clear();
                mapping_.clear();
                ++count_;

                if (count_ > 2)
                {
                    count_ = 0;
                    std::cout << '\n';
                }
            }
        }
    } while (results_.id != 0);
}
Exemple #4
0
/* Subroutine */ int deritr_(doublereal *errfn, doublereal *geo)
{
    /* Initialized data */

    static integer icalcn = 0;

    /* System generated locals */
    integer i__1, i__2, i__3, i__4;

    /* Builtin functions */
    integer i_indx(char *, char *, ftnlen, ftnlen);
    double pow_di(doublereal *, integer *);
    integer s_wsfe(cilist *), e_wsfe(void), do_fio(integer *, char *, ftnlen);

    /* Local variables */
    static integer i__, j, k, l;
#define w ((doublereal *)&wmatrx_1)
    static doublereal aa, ee;
    static integer ij, ii, il, jl, kl, ll;
    extern /* Subroutine */ int iter_(doublereal *, doublereal *, doublereal *
	    , doublereal *, doublereal *, logical *, logical *);
    static doublereal xjuc[3];
    static logical debug;
    extern /* Subroutine */ int hcore_(doublereal *, doublereal *, doublereal 
	    *, doublereal *, doublereal *, doublereal *);
    static doublereal coord[360]	/* was [3][120] */, change[3];
    static integer idelta, linear;
    static doublereal xparam[360], xderiv[3];
    extern /* Subroutine */ int gmetry_(doublereal *, doublereal *);
    static doublereal xstore;
    extern /* Subroutine */ int symtry_(void);

    /* Fortran I/O blocks */
    static cilist io___24 = { 0, 6, 0, "(' ERROR FUNCTION')", 0 };
    static cilist io___25 = { 0, 6, 0, "(10F8.3)", 0 };


/* COMDECK SIZES */
/* *********************************************************************** */
/*   THIS FILE CONTAINS ALL THE ARRAY SIZES FOR USE IN MOPAC. */

/*     THERE ARE ONLY 5 PARAMETERS THAT THE PROGRAMMER NEED SET: */
/*     MAXHEV = MAXIMUM NUMBER OF HEAVY ATOMS (HEAVY: NON-HYDROGEN ATOMS) */
/*     MAXLIT = MAXIMUM NUMBER OF HYDROGEN ATOMS. */
/*     MAXTIM = DEFAULT TIME FOR A JOB. (SECONDS) */
/*     MAXDMP = DEFAULT TIME FOR AUTOMATIC RESTART FILE GENERATION (SECS) */
/*     ISYBYL = 1 IF MOPAC IS TO BE USED IN THE SYBYL PACKAGE, =0 OTHERWISE */
/*     SEE ALSO NMECI, NPULAY AND MESP AT THE END OF THIS FILE */


/* *********************************************************************** */

/*   THE FOLLOWING CODE DOES NOT NEED TO BE ALTERED BY THE PROGRAMMER */

/* *********************************************************************** */

/*    ALL OTHER PARAMETERS ARE DERIVED FUNCTIONS OF THESE TWO PARAMETERS */

/*      NAME                   DEFINITION */
/*     NUMATM         MAXIMUM NUMBER OF ATOMS ALLOWED. */
/*     MAXORB         MAXIMUM NUMBER OF ORBITALS ALLOWED. */
/*     MAXPAR         MAXIMUM NUMBER OF PARAMETERS FOR OPTIMISATION. */
/*     N2ELEC         MAXIMUM NUMBER OF TWO ELECTRON INTEGRALS ALLOWED. */
/*     MPACK          AREA OF LOWER HALF TRIANGLE OF DENSITY MATRIX. */
/*     MORB2          SQUARE OF THE MAXIMUM NUMBER OF ORBITALS ALLOWED. */
/*     MAXHES         AREA OF HESSIAN MATRIX */
/*     MAXALL         LARGER THAN MAXORB OR MAXPAR. */
/* *********************************************************************** */

/* *********************************************************************** */
/* DECK MOPAC */
/* *********************************************************************** */

/*    DERITR CALCULATES THE DERIVATIVES OF THE ENERGY WITH RESPECT TO THE */
/*          INTERNAL COORDINATES. THIS IS DONE BY FINITE DIFFERENCES */
/*          USING FULL SCF CALCULATIONS. */

/*          THIS IS VERY TIME-CONSUMING, AND SHOULD ONLY BE USED WHEN */
/*          NO OTHER DERIVATIVE CALCULATION WILL DO. */

/*    THE MAIN ARRAYS IN DERIV ARE: */
/*        LOC    INTEGER ARRAY, LOC(1,I) CONTAINS THE ADDRESS OF THE ATOM */
/*               INTERNAL COORDINATE LOC(2,I) IS TO BE USED IN THE */
/*               DERIVATIVE CALCULATION. */
/*        GEO    ARRAY \GEO\ HOLDS THE INTERNAL COORDINATES. */

/* *********************************************************************** */
    /* Parameter adjustments */
    geo -= 4;
    --errfn;

    /* Function Body */
    if (icalcn != numcal_1.numcal) {
	debug = i_indx(keywrd_1.keywrd, "DERITR", (ftnlen)241, (ftnlen)6) != 
		0;
	icalcn = numcal_1.numcal;

/*   IDELTA IS A MACHINE-PRECISION DEPENDANT INTEGER */

	idelta = -3;
	change[0] = pow_di(&c_b3, &idelta);
	change[1] = pow_di(&c_b3, &idelta);
	change[2] = pow_di(&c_b3, &idelta);

/*    CHANGE(I) IS THE STEP SIZE USED IN CALCULATING THE DERIVATIVES. */
/*    BECAUSE FULL SCF CALCULATIONS ARE BEING DONE QUITE LARGE STEPS */
/*    ARE NEEDED.  ON THE OTHER HAND, THE STEP CANNOT BE VERY LARGE, */
/*    AS THE SECOND DERIVITIVE IN FLEPO IS CALCULATED FROM THE */
/*    DIFFERENCES OF TWO FIRST DERIVATIVES. CHANGE(1) IS FOR CHANGE IN */
/*    BOND LENGTH, (2) FOR ANGLE, AND (3) FOR DIHEDRAL. */

	xderiv[0] = .5 / change[0];
	xderiv[1] = .5 / change[1];
	xderiv[2] = .5 / change[2];
    }
    i__1 = geovar_1.nvar;
    for (i__ = 1; i__ <= i__1; ++i__) {
/* L10: */
	xparam[i__ - 1] = geo[geovar_1.loc[(i__ << 1) - 1] + geovar_1.loc[(
		i__ << 1) - 2] * 3];
    }
    if (geosym_1.ndep != 0) {
	symtry_();
    }
    gmetry_(&geo[4], coord);

/*  ESTABLISH THE ENERGY AT THE CURRENT POINT */

    hcore_(coord, hmatrx_1.h__, w, wmatrx_1.wj, wmatrx_1.wk, &enuclr_1.enuclr)
	    ;
    if (molkst_1.norbs * molkst_1.nelecs > 0) {
	iter_(hmatrx_1.h__, w, wmatrx_1.wj, wmatrx_1.wk, &aa, &c_true, &
		c_false);
    } else {
	aa = 0.;
    }
    linear = molkst_1.norbs * (molkst_1.norbs + 1) / 2;

/*  RESTORE THE DENSITY MATRIX (WHY?) */

    i__1 = linear;
    for (i__ = 1; i__ <= i__1; ++i__) {
/* L20: */
	densty_1.p[i__ - 1] = densty_1.pa[i__ - 1] * 2.;
    }
    aa += enuclr_1.enuclr;
    ij = 0;
    i__1 = molkst_1.numat;
    for (ii = 1; ii <= i__1; ++ii) {
	i__2 = ucell_1.l1u;
	for (il = ucell_1.l1l; il <= i__2; ++il) {
	    i__3 = ucell_1.l2u;
	    for (jl = ucell_1.l2l; jl <= i__3; ++jl) {
		i__4 = ucell_1.l3u;
		for (kl = ucell_1.l3l; kl <= i__4; ++kl) {
		    for (ll = 1; ll <= 3; ++ll) {
/* L30: */
			xjuc[ll - 1] = coord[ll + ii * 3 - 4] + euler_1.tvec[
				ll - 1] * il + euler_1.tvec[ll + 2] * jl + 
				euler_1.tvec[ll + 5] * kl;
		    }
		    ++ij;
/* L50: */
		}
	    }
	}
/* L60: */
    }
    i__1 = geovar_1.nvar;
    for (i__ = 1; i__ <= i__1; ++i__) {
	k = geovar_1.loc[(i__ << 1) - 2];
	l = geovar_1.loc[(i__ << 1) - 1];
	xstore = xparam[i__ - 1];
	i__4 = geovar_1.nvar;
	for (j = 1; j <= i__4; ++j) {
/* L70: */
	    geo[geovar_1.loc[(j << 1) - 1] + geovar_1.loc[(j << 1) - 2] * 3] =
		     xparam[j - 1];
	}
	geo[l + k * 3] = xstore - change[l - 1];
	if (geosym_1.ndep != 0) {
	    symtry_();
	}
	gmetry_(&geo[4], coord);

/*   IF NEEDED, CALCULATE "EXACT" DERIVITIVES. */

	hcore_(coord, hmatrx_1.h__, w, wmatrx_1.wj, wmatrx_1.wk, &
		enuclr_1.enuclr);
	if (molkst_1.norbs * molkst_1.nelecs > 0) {
	    iter_(hmatrx_1.h__, w, wmatrx_1.wj, wmatrx_1.wk, &ee, &c_true, &
		    c_false);
	} else {
	    ee = 0.;
	}
	i__4 = linear;
	for (ii = 1; ii <= i__4; ++ii) {
/* L80: */
	    densty_1.p[ii - 1] = densty_1.pa[ii - 1] * 2.;
	}
	ee += enuclr_1.enuclr;
	errfn[i__] = (aa - ee) * 23.061 * xderiv[l - 1] * 2.;
/* L90: */
    }
    if (debug) {
	s_wsfe(&io___24);
	e_wsfe();
	s_wsfe(&io___25);
	i__1 = geovar_1.nvar;
	for (i__ = 1; i__ <= i__1; ++i__) {
	    do_fio(&c__1, (char *)&errfn[i__], (ftnlen)sizeof(doublereal));
	}
	e_wsfe();
    }
    return 0;
} /* deritr_ */
Exemple #5
0
bool search(iterator first_, iterator second_, captures &captures_,
    lsm &lsm_, const sm_type &gsm_)
{
    typedef lexertl::iterator<iterator, lsm, lexertl::
        match_results<iterator> > lex_iterator;
    lex_iterator iter_(first_, second_, lsm_);
    lex_iterator end_;
    basic_match_results<sm_type> results_(iter_->id, gsm_);
    typedef parsertl::token<lex_iterator> token;
    typedef typename token::token_vector token_vector;
    typedef std::multimap<typename sm_type::id_type, token_vector> prod_map;
    prod_map prod_map_;
    bool success_ = search(gsm_, iter_, end_, &prod_map_);

    captures_.clear();

    if (success_)
    {
        iterator last_ = iter_->first;
        typename prod_map::const_iterator pi_ = prod_map_.begin();
        typename prod_map::const_iterator pe_ = prod_map_.end();

        captures_.resize((gsm_._captures.empty() ? 0 :
            gsm_._captures.back().first +
            gsm_._captures.back().second.size()) + 1);
        captures_[0].push_back(std::make_pair(iter_->first, iter_->first));

        for (; pi_ != pe_; ++pi_)
        {
            if (gsm_._captures.size() > pi_->first)
            {
                const typename sm_type::capture_vec_pair &row_ =
                    gsm_._captures[pi_->first];

                if (!row_.second.empty())
                {
                    typedef typename sm_type::capture_vector capture_vector;
                    typename capture_vector::const_iterator ti_ =
                        row_.second.begin();
                    typename capture_vector::const_iterator te_ =
                        row_.second.end();
                    std::size_t index_ = 0;

                    for (; ti_ != te_; ++ti_)
                    {
                        const token &token1_ = pi_->second[ti_->first];
                        const token &token2_ = pi_->second[ti_->second];

                        captures_[row_.first + index_ + 1].
                            push_back(std::make_pair(token1_.first,
                                token2_.second));
                        ++index_;
                    }
                }
            }
        }

        pi_ = prod_map_.begin();
        pe_ = prod_map_.end();

        for (; pi_ != pe_; ++pi_)
        {
            typename token::iter_type second_ = pi_->second.back().second;

            if (second_ > last_)
            {
                last_ = second_;
            }
        }

        captures_.front().back().second = last_;
    }

    return success_;
}
Exemple #6
0
std::string rev_regex(const std::string &rx_, const lexertl::state_machine &sm_)
{
    std::string str_;
    std::string curr_;
    token_stack stack_;
    lexertl::citerator iter_(rx_.c_str(), rx_.c_str() + rx_.length(), sm_);
    lexertl::citerator end_;
    std::size_t parens_ = 0;

    for (; iter_ != end_; ++iter_)
    {
        switch (iter_->id)
        {
        case eCharset:
        case eMacro:
        case eComment:
            stack_.push(token_pair((eToken)iter_->id, iter_->str()));
            break;
        case eString:
        {
            lexertl::citerator i_(iter_->start + 1, iter_->end - 1, sm_);
            lexertl::citerator e_;
            std::string str_;

            for (; i_ != e_; ++i_)
            {
                str_ = i_->str() + str_;
            }

            str_ = '"' + str_ + '"';
            stack_.push(token_pair((eToken)iter_->id, str_));
            break;
        }
        case eQuantifier:
            if (stack_.empty())
            {
                throw std::runtime_error("Quantifier without regex.");
            }

            stack_.top().second += iter_->str();
            break;
        case eDifference:
            if (stack_.empty())
            {
                throw std::runtime_error("Difference without regex.");
            }

            stack_.top().second += iter_->str();
            ++iter_;
            stack_.top().second += iter_->str();
            break;
        case eBOL:
            // Reverse to eEOL
            stack_.push(token_pair(eEOL, std::string(1, '$')));
            break;
        case eEOL:
            // Reverse to eBOL
            stack_.push(token_pair(eBOL, std::string(1, '^')));
            break;
        case eOr:
            reduce_stack(stack_);
            stack_.push(token_pair((eToken)iter_->id, iter_->str()));
            break;
        case eOpen:
            stack_.push(token_pair((eToken)iter_->id, iter_->str()));
            ++parens_;
            break;
        case eClose:
        {
            if (parens_ < 1)
            {
                throw std::runtime_error("Unbalanced parens in regex.");
            }

            std::string str_;

            reduce_stack(stack_);
            str_ = stack_.top().second;
            str_ += iter_->str();
            stack_.pop();
            stack_.top().second += str_;
            stack_.top().first = eCharset;
            --parens_;
            break;
        }
        default:
            throw std::runtime_error("Unknown regex token.");
            break;
        }
    }

    for (; !stack_.empty(); stack_.pop())
    {
        str_ += stack_.top().second;
    }

    return str_;
}