44#include < string>
55#include < vector>
66#include < memory>
7+ #include " mlir/IR/Builders.h"
8+ #include " mlir/IR/BuiltinOps.h"
9+ #include " mlir/IR/MLIRContext.h"
10+
11+ #include " PolyFlow/PolyFlowDialect.h"
12+ #include " PolyFlow/PolyFlowTypes.h"
13+ #include " PolyFlow/PolyFlowOps.h"
14+
15+
16+ namespace snakemake {
717
818enum TokenType {
919 RULE,
@@ -26,9 +36,9 @@ struct Token {
2636 size_t column;
2737};
2838
29- class SnakemakeLexer {
39+ class Lexer {
3040 public:
31- SnakemakeLexer (std::istream& input) : input_(input) {}
41+ Lexer (std::istream& input) : input_(input) {}
3242 Token nextToken ();
3343 bool eof () const { return input_.eof (); }
3444
@@ -49,57 +59,89 @@ class SnakemakeLexer {
4959 Token readIdentifierOrKeyword ();
5060};
5161
52- class TreeNode {
62+ class BaseAST {
5363public:
54- std::string name;
55- std::vector<std::shared_ptr<TreeNode>> children;
64+ enum ASTKind {
65+ Rule,
66+ };
5667
57- TreeNode (const std::string &name) : name(name) {}
68+ BaseAST (ASTKind kind, Token location)
69+ : kind(kind), location(std::move(location)) {}
70+ virtual ~BaseAST () = default ;
5871
59- void add_child (const std::shared_ptr<TreeNode> &child) {
60- children.push_back (child);
61- }
72+ ASTKind getKind () const { return kind; }
6273
63- void print (int indent = 0 ) {
64- for (int i = 0 ; i < indent; ++i) {
65- std::cout << " " ;
66- }
67- std::cout << name << std::endl;
68- for (const auto &child : children) {
69- child->print (indent + 1 );
70- }
71- }
74+ const Token &loc () { return location; }
75+
76+ private:
77+ const ASTKind kind;
78+ Token location;
79+ };
80+
81+ class RuleAST : public BaseAST {
82+ public:
83+ std::string name;
84+ std::vector<std::string> inputs;
85+ std::vector<std::string> outputs;
86+ std::string command;
87+
88+ RuleAST (Token loc,
89+ std::string name,
90+ std::vector<std::string> inputs,
91+ std::vector<std::string> outputs,
92+ std::string command)
93+ : BaseAST(Rule, std::move(loc)), name(std::move(name)), inputs(std::move(inputs)), outputs(std::move(outputs)), command(std::move(command)) {}
94+
95+ static bool classof (const BaseAST *c) { return c->getKind () == Rule; }
7296};
7397
74- class SnakemakeParser {
98+ class ModuleAST {
99+ public:
100+ std::vector<std::unique_ptr<RuleAST>> rules;
101+ ModuleAST (std::vector<std::unique_ptr<RuleAST>> rules)
102+ : rules(std::move(rules)) {}
103+ };
104+
105+ void dumpAST (ModuleAST &);
106+
107+ class Parser {
75108public:
76- SnakemakeParser (std::istream& input): lexer_(input) {}
109+ Parser (std::istream& input): lexer_(input) {}
77110
78- void parse () {
111+ std::unique_ptr<ModuleAST> parseModule () {
79112 advance ();
80- snakemake ();
81- }
82-
83- void print_tree () {
84- root->print ();
113+ return snakemake ();
85114 }
86115
87116private:
88- SnakemakeLexer lexer_;
117+ Lexer lexer_;
89118 Token lookahead;
90- std::shared_ptr<TreeNode> root = std::make_shared<TreeNode>(" snakemake" );
91119
92120 void advance ();
93121
94122 void throw_unexpected_token ();
95123
96124 void match (const TokenType tokenType);
97125
98- std::shared_ptr<TreeNode > snakemake ();
99- std::shared_ptr<TreeNode > rule ();
126+ std::unique_ptr<ModuleAST > snakemake ();
127+ std::unique_ptr<RuleAST > rule ();
100128
101- std::shared_ptr<TreeNode > input_rule ();
102- std::shared_ptr<TreeNode > output_rule ();
103- std::shared_ptr<TreeNode> shell_rule ();
104- std::shared_ptr<TreeNode > parameter_list ();
129+ std::vector<std::string > input_rule ();
130+ std::vector<std::string > output_rule ();
131+ std::string shell_rule ();
132+ std::vector<std::string > parameter_list ();
105133};
134+
135+ class MLIRGen {
136+ public:
137+ MLIRGen (mlir::MLIRContext &context) : builder(&context) {}
138+ mlir::ModuleOp mlirGen (ModuleAST &);
139+
140+ private:
141+ mlir::ModuleOp theModule;
142+ mlir::OpBuilder builder;
143+
144+ polyflow::StepOp mlirGen (RuleAST &);
145+ };
146+
147+ } // namespace snakemake
0 commit comments