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

Last change on this file since 4617 was 4617, checked in by nmedfort, 4 years ago

Upload of an untested (inactive) UCD compiler.

File size: 2.8 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#include <re/re_cc.h>
11#include <pablo/builder.hpp>
12#include "utf_encoding.h"
13#include <string>
14
15namespace cc {
16
17class CC_NameMap;
18
19class CC_Compiler{
20public:
21
22    using Vars = std::vector<pablo::Var *>;
23
24    CC_Compiler(pablo::PabloBlock & entry, const Encoding & encoding, const std::string basis_pattern = "basis");
25
26    const Vars & getBasisBits(const CC_NameMap & nameMap) const;
27
28    pablo::Assign * compileCC(const re::CC *cc);
29
30    pablo::Assign * compileCC(const re::CC *cc, pablo::PabloBlock & block);
31
32    pablo::Assign * compileCC(const re::CC *cc, pablo::PabloBuilder & builder);
33
34    pablo::Assign * compileCC(const std::string && canonicalName, const re::CC *cc, pablo::PabloBlock & block);
35
36    pablo::Assign * compileCC(const std::string &&canonicalName, const re::CC *cc, pablo::PabloBuilder & builder);
37
38    void compileByteClasses(re::RE * re);
39
40private:
41    pablo::Var * getBasisVar(const int n) const;
42    template<typename PabloBlockOrBuilder>
43    pablo::PabloAST * bit_pattern_expr(const unsigned pattern, unsigned selected_bits, PabloBlockOrBuilder & pb);
44    template<typename PabloBlockOrBuilder>
45    pablo::PabloAST * char_test_expr(const re::codepoint_t ch, PabloBlockOrBuilder & pb);
46    template<typename PabloBlockOrBuilder>
47    pablo::PabloAST * make_range(const re::codepoint_t n1, const re::codepoint_t n2, PabloBlockOrBuilder & pb);
48    template<typename PabloBlockOrBuilder>
49    pablo::PabloAST * GE_Range(const unsigned N, const unsigned n, PabloBlockOrBuilder & pb);
50    template<typename PabloBlockOrBuilder>
51    pablo::PabloAST * LE_Range(const unsigned N, const unsigned n, PabloBlockOrBuilder & pb);
52    template<typename PabloBlockOrBuilder>
53    pablo::PabloAST * char_or_range_expr(const re::codepoint_t lo, const re::codepoint_t hi, PabloBlockOrBuilder & pb);
54    template<typename PabloBlockOrBuilder>
55    pablo::PabloAST * charset_expr(const re::CC *cc, PabloBlockOrBuilder & pb);
56private:   
57    pablo::PabloBuilder         mBuilder;
58    std::vector<pablo::Var *>   mBasisBit;
59    const Encoding &            mEncoding;
60};
61
62inline pablo::Assign * CC_Compiler::compileCC(const re::CC *cc) {
63    return compileCC(cc, mBuilder);
64}
65
66inline pablo::Assign * CC_Compiler::compileCC(const re::CC *cc, pablo::PabloBlock & block) {
67    return compileCC(std::move(cc->canonicalName(re::ByteClass)), cc, block);
68}
69
70inline pablo::Assign * CC_Compiler::compileCC(const re::CC *cc, pablo::PabloBuilder & builder) {
71    return compileCC(std::move(cc->canonicalName(re::ByteClass)), cc, builder);
72}
73
74inline const CC_Compiler::Vars & CC_Compiler::getBasisBits(const CC_NameMap &) const {
75    return mBasisBit;
76}
77
78
79}
80
81#endif // CC_COMPILER_H
82
83
Note: See TracBrowser for help on using the repository browser.