1 module ddc.lexer.parser;
2 
3 import ddc.lexer.tokenizer;
4 import ddc.lexer.ast;
5 import dlangui.core.textsource;
6 import dlangui.core.logger;
7 
8 class Parser {
9     SourceLines _lines;
10     SourceFile _file;
11     Token[] _tokens;
12     int[] _pairedBracket;
13     int[] _bracketLevel;
14     void init(SourceLines lines, SourceFile file) {
15         _lines = lines;
16         _file = file;
17     }
18     void init(dstring text, SourceFile file) {
19         import std.array;
20         ArraySourceLines lines = new ArraySourceLines();
21         dstring[] src = text.split('\n');
22         lines.initialize(src, file, 0);
23         init(lines, file);
24     }
25     void init(dstring src, string filename) {
26         init(src, new SourceFile(filename));
27     }
28     bool findBracketPairs() {
29         bool res = true;
30         _pairedBracket.length = _tokens.length;
31         _pairedBracket[0 .. $] = -1;
32         _bracketLevel.length = _tokens.length;
33         _bracketLevel[0 .. $] = -1;
34         return res;
35     }
36     bool tokenize() {
37         bool res = false;
38         Tokenizer tokenizer = new Tokenizer(_lines);
39         //tokenizer.errorTolerant = true;
40         try {
41             _tokens = tokenizer.allTokens();
42             Log.v("tokens: ", _tokens);
43             findBracketPairs();
44             res = true;
45         } catch (Exception e) {
46             // error
47             Log.e("Tokenizer exception", e);
48         }
49         return res;
50     }
51 }
52 
53 ASTNode parseSource(dstring text, SourceFile file) {
54     ASTNode res;
55     Parser parser = new Parser();
56     parser.init(text, file);
57     parser.tokenize();
58     return res;
59 }
60 
61 ASTNode parseSource(dstring text, string filename) {
62     return parseSource(text, new SourceFile(filename));
63 }
64 
65 debug(TestParser):
66 
67 void testParser(dstring source) {
68     Log.setLogLevel(LogLevel.Trace);
69     Log.d("Trying to parse\n", source);
70     ASTNode res = parseSource(source, "main.d");
71 }
72 
73 void runParserTests() {
74     testParser(q{
75         // testing parser
76         import std.stdio;
77         int main(string[]) {
78         }
79     });
80 }