source: icGREP/icgrep-devel/icgrep/cc/cc_compiler.h @ 5202

Last change on this file since 5202 was 5202, checked in by nmedfort, 3 years ago

Initial work on adding types to PabloAST and mutable Var objects.

File size: 3.3 KB
Line 
1/*
2 *  Copyright (c) 2014 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 *  icgrep is a trademark of International Characters.
5 */
6
7#ifndef CC_COMPILER_H
8#define CC_COMPILER_H
9
10
11#include <re/re_cc.h>
12#include <pablo/builder.hpp>
13#include <string>
14
15namespace pablo {
16    class PabloFunction;
17    class Var;
18}
19
20namespace cc {
21
22class CC_NameMap;
23
24class CC_Compiler{
25
26    friend pablo::PabloFunction * ParabixCharacterClassFunction(const std::string &, const std::vector<re::CC *> &, const unsigned);
27
28public:
29
30    using Vars = std::vector<pablo::Var *>;
31
32    CC_Compiler(pablo::PabloFunction & function, const unsigned encodingBits = 8, const std::string prefix = "basis");
33
34    pablo::PabloAST * compileCC(const re::CC *cc);
35
36    pablo::PabloAST *compileCC(const re::CC *cc, pablo::PabloBlock & block);
37
38    pablo::PabloAST * compileCC(const re::CC *cc, pablo::PabloBuilder & builder);
39
40    pablo::PabloAST * compileCC(const std::string & canonicalName, const re::CC *cc, pablo::PabloBlock & block);
41
42    pablo::PabloAST * compileCC(const std::string & canonicalName, const re::CC *cc, pablo::PabloBuilder & builder);
43
44    pablo::PabloBuilder & getBuilder();
45
46    const std::vector<pablo::PabloAST *> & getBasisBits() {
47        return mBasisBit;
48    }
49
50    bool isUTF_16() const {
51        return mEncodingBits == 16;
52    }
53
54private:
55    pablo::PabloAST * getBasisVar(const unsigned n) const;
56    template<typename PabloBlockOrBuilder>
57    pablo::PabloAST * bit_pattern_expr(const unsigned pattern, unsigned selected_bits, PabloBlockOrBuilder & pb);
58    template<typename PabloBlockOrBuilder>
59    pablo::PabloAST * char_test_expr(const re::codepoint_t ch, PabloBlockOrBuilder & pb);
60    template<typename PabloBlockOrBuilder>
61    pablo::PabloAST * make_range(const re::codepoint_t n1, const re::codepoint_t n2, PabloBlockOrBuilder & pb);
62    template<typename PabloBlockOrBuilder>
63    pablo::PabloAST * GE_Range(const unsigned N, const unsigned n, PabloBlockOrBuilder & pb);
64    template<typename PabloBlockOrBuilder>
65    pablo::PabloAST * LE_Range(const unsigned N, const unsigned n, PabloBlockOrBuilder & pb);
66    template<typename PabloBlockOrBuilder>
67    pablo::PabloAST * char_or_range_expr(const re::codepoint_t lo, const re::codepoint_t hi, PabloBlockOrBuilder & pb);
68    template<typename PabloBlockOrBuilder>
69    pablo::PabloAST * charset_expr(const re::CC *cc, PabloBlockOrBuilder & pb);
70private:   
71    pablo::PabloBuilder             mBuilder;
72    std::vector<pablo::PabloAST *>  mBasisBit;
73    const unsigned                  mEncodingBits;
74    unsigned                        mEncodingMask;
75};
76
77inline pablo::PabloAST *CC_Compiler::compileCC(const re::CC *cc) {
78    return compileCC(cc, mBuilder);
79}
80
81inline pablo::PabloAST * CC_Compiler::compileCC(const re::CC *cc, pablo::PabloBlock & block) {
82    return compileCC(cc->canonicalName(re::ByteClass), cc, block);
83}
84
85inline pablo::PabloAST *CC_Compiler::compileCC(const re::CC *cc, pablo::PabloBuilder & builder) {
86    return compileCC(cc->canonicalName(re::ByteClass), cc, builder);
87}
88
89inline pablo::PabloBuilder & CC_Compiler::getBuilder() {
90    return mBuilder;
91}
92
93pablo::PabloFunction * ParabixCharacterClassFunction(const std::string & name, const std::vector<re::CC *> & charClasses, const unsigned basisBitsCount);
94
95}
96
97#endif // CC_COMPILER_H
98
99
Note: See TracBrowser for help on using the repository browser.