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 }