Added start of compiler.
This commit is contained in:
		
							parent
							
								
									d9d1b539cd
								
							
						
					
					
						commit
						b82bfae676
					
				| 
						 | 
				
			
			@ -5,5 +5,8 @@
 | 
			
		|||
	"copyright": "Copyright © 2023, Andrew Lalis",
 | 
			
		||||
	"description": "Compiler for the NIMP language.",
 | 
			
		||||
	"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.string;
 | 
			
		||||
import nimpc;
 | 
			
		||||
import streams;
 | 
			
		||||
 | 
			
		||||
void main() {
 | 
			
		||||
	writeln("Edit source/app.d to start your project.");
 | 
			
		||||
int main(string[] args) {
 | 
			
		||||
	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