Added start of compiler.
This commit is contained in:
		
							parent
							
								
									d9d1b539cd
								
							
						
					
					
						commit
						b82bfae676
					
				| 
						 | 
					@ -5,5 +5,8 @@
 | 
				
			||||||
	"copyright": "Copyright © 2023, Andrew Lalis",
 | 
						"copyright": "Copyright © 2023, Andrew Lalis",
 | 
				
			||||||
	"description": "Compiler for the NIMP language.",
 | 
						"description": "Compiler for the NIMP language.",
 | 
				
			||||||
	"license": "MIT",
 | 
						"license": "MIT",
 | 
				
			||||||
	"name": "compiler"
 | 
						"name": "compiler",
 | 
				
			||||||
 | 
						"dependencies": {
 | 
				
			||||||
 | 
							"streams": "~>3.4.3"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,6 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						"fileVersion": 1,
 | 
				
			||||||
 | 
						"versions": {
 | 
				
			||||||
 | 
							"streams": "3.4.3"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,18 @@
 | 
				
			||||||
import std.stdio;
 | 
					import std.stdio;
 | 
				
			||||||
 | 
					import std.string;
 | 
				
			||||||
 | 
					import nimpc;
 | 
				
			||||||
 | 
					import streams;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void main() {
 | 
					int main(string[] args) {
 | 
				
			||||||
	writeln("Edit source/app.d to start your project.");
 | 
						if (args.length < 2) {
 | 
				
			||||||
 | 
							writeln("Missing required file args.");
 | 
				
			||||||
 | 
							return 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						string[] files = args[1 .. $];
 | 
				
			||||||
 | 
						writefln!"Compiling %s"(files);
 | 
				
			||||||
 | 
						foreach (filename; files) {
 | 
				
			||||||
 | 
							auto sIn = FileInputStream(toStringz(filename));
 | 
				
			||||||
 | 
							auto tokens = tokenize(sIn);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,6 @@
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * This module contains definitions for the components in NIMP's abstract
 | 
				
			||||||
 | 
					 * syntax tree.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					module nimpc.ast;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,62 @@
 | 
				
			||||||
 | 
					module nimpc.lexer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import streams;
 | 
				
			||||||
 | 
					import std.stdio;
 | 
				
			||||||
 | 
					import std.regex;
 | 
				
			||||||
 | 
					import std.array;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum TokenType {
 | 
				
			||||||
 | 
					    KEYWORD,
 | 
				
			||||||
 | 
					    DATA_TYPE,
 | 
				
			||||||
 | 
					    SENTENCE_END,
 | 
				
			||||||
 | 
					    LITERAL_INTEGER,
 | 
				
			||||||
 | 
					    LITERAL_FLOAT,
 | 
				
			||||||
 | 
					    LITERAL_BOOLEAN,
 | 
				
			||||||
 | 
					    LITERAL_STRING
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct Token {
 | 
				
			||||||
 | 
					    TokenType type;
 | 
				
			||||||
 | 
					    string content;
 | 
				
			||||||
 | 
					    uint line;
 | 
				
			||||||
 | 
					    uint column;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class LexerException : Exception {
 | 
				
			||||||
 | 
					    const uint sourceLine;
 | 
				
			||||||
 | 
					    const uint sourceColumn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this(string msg, uint sourceLine, uint sourceColumn) {
 | 
				
			||||||
 | 
					        super(msg);
 | 
				
			||||||
 | 
					        this.sourceLine = sourceLine;
 | 
				
			||||||
 | 
					        this.sourceColumn = sourceColumn;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Parses a list of tokens from an input stream of lines of code.
 | 
				
			||||||
 | 
					 * Params:
 | 
				
			||||||
 | 
					 *   inputStream = The lines of input to parse.
 | 
				
			||||||
 | 
					 * Returns: A list of tokens.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					Token[] tokenize(S)(S inputStream) if (isInputStream!(S, char)) {
 | 
				
			||||||
 | 
					    Appender!(Token[]) tokenApp;
 | 
				
			||||||
 | 
					    uint line = 0;
 | 
				
			||||||
 | 
					    uint col = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    while (true) {
 | 
				
			||||||
 | 
					        char c = readChar(inputStream, line, col);
 | 
				
			||||||
 | 
					        writeln(c);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return tokenApp[];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private char readChar(S)(S stream, uint line, uint col) if (isInputStream!(S, char)) {
 | 
				
			||||||
 | 
					    auto result = readOne(stream);
 | 
				
			||||||
 | 
					    if (result.hasError) {
 | 
				
			||||||
 | 
					        throw new LexerException("Failed to read one more char from stream.", line, col);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return result.element;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,8 @@
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * The NIMP compiler front-end module, which includes the language's lexer,
 | 
				
			||||||
 | 
					 * parser, and syntax tree.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					module nimpc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public import nimpc.ast;
 | 
				
			||||||
 | 
					public import nimpc.lexer;
 | 
				
			||||||
		Loading…
	
		Reference in New Issue