From 2f493c870bf6bcee20650b604cb4b13e34fb2e31 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Fri, 14 Dec 2018 01:05:32 -0600 Subject: [PATCH] Initial commit --- christmas_proj | Bin 0 -> 211640 bytes christmas_proj.nimble | 19 +++++++ data/progs/test.lgt | 8 +++ data/shaders/basic.frag | 11 ++++ data/shaders/basic.vert | 13 +++++ docs/plan.txt | 16 ++++++ src/christmas_proj.nim | 96 +++++++++++++++++++++++++++++++ src/gfx/glutils.nim | 71 +++++++++++++++++++++++ src/gfx/window.nim | 56 ++++++++++++++++++ src/lang/ast.nim | 49 ++++++++++++++++ src/lang/lexer.nim | 88 +++++++++++++++++++++++++++++ src/lang/parser.nim | 122 ++++++++++++++++++++++++++++++++++++++++ src/lang/tokens.nim | 52 +++++++++++++++++ src/lang/types.nim | 10 ++++ src/utils/iter.nim | 34 +++++++++++ 15 files changed, 645 insertions(+) create mode 100755 christmas_proj create mode 100644 christmas_proj.nimble create mode 100644 data/progs/test.lgt create mode 100644 data/shaders/basic.frag create mode 100644 data/shaders/basic.vert create mode 100644 docs/plan.txt create mode 100644 src/christmas_proj.nim create mode 100644 src/gfx/glutils.nim create mode 100644 src/gfx/window.nim create mode 100644 src/lang/ast.nim create mode 100644 src/lang/lexer.nim create mode 100644 src/lang/parser.nim create mode 100644 src/lang/tokens.nim create mode 100644 src/lang/types.nim create mode 100644 src/utils/iter.nim diff --git a/christmas_proj b/christmas_proj new file mode 100755 index 0000000000000000000000000000000000000000..b8d76b0665683e8992ff1939def2cd391f90b42a GIT binary patch literal 211640 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

PoNm#v+!uZYI#-g{ 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

>*#VyAXT^P@RrHvG@-*2iJN5Z| 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 L1FajpeeL{Th= 0.19.0" +requires "opengl >= 1.2.0" +requires "glfw" + +task run, "Run project": + exec("nimble build") + exec("./christmas_proj") \ No newline at end of file diff --git a/data/progs/test.lgt b/data/progs/test.lgt new file mode 100644 index 0000000..e8f784f --- /dev/null +++ b/data/progs/test.lgt @@ -0,0 +1,8 @@ +$MEM_1 = 0 +$MEM_2 = 1 + +WHILE $MEM_2 < 100000 DO + $MEM_3 = $MEM_1 + $MEM_2 + $MEM_1 = $MEM_2 + $MEM_2 = $MEM_3 +END \ No newline at end of file diff --git a/data/shaders/basic.frag b/data/shaders/basic.frag new file mode 100644 index 0000000..cf3f5a7 --- /dev/null +++ b/data/shaders/basic.frag @@ -0,0 +1,11 @@ +#version 300 es + +precision mediump float; + +in vec4 v_col; + +out vec4 fragColor; + +void main() { + fragColor = v_col * vec4(1.0, 1.0, 1.0, 1.0); +} \ No newline at end of file diff --git a/data/shaders/basic.vert b/data/shaders/basic.vert new file mode 100644 index 0000000..d539b87 --- /dev/null +++ b/data/shaders/basic.vert @@ -0,0 +1,13 @@ +#version 300 es + +//uniform mat3 u_proj; +layout(location = 0) in vec2 a_pos; +layout(location = 1) in vec4 a_col; + +out vec4 v_col; + +void main() { + float scalar = float(gl_InstanceID) * 2.f - 1.f; + gl_Position = vec4(a_pos, 0.0, 0.0) * scalar + vec4(0, 0, 0, 1); + v_col = a_col; +} \ No newline at end of file diff --git a/docs/plan.txt b/docs/plan.txt new file mode 100644 index 0000000..db097b0 --- /dev/null +++ b/docs/plan.txt @@ -0,0 +1,16 @@ +ROBOT PROGRAMMING AND VISUALS + +Create custom programming language that instructions robots to move around a grid and perform tasks. +Visualize this system with OpenGL 3.0 ES + +Language may look something like this: + +$A = 10 +:LOOP_TOP + IF $A ~= 0 THEN + $A = $A - 1 + GOTO :LOOP_TOP + END + +This is compiled to a bytecode, which is executed by the program. +Language is compiled at runtime, then bytecode is used. \ No newline at end of file diff --git a/src/christmas_proj.nim b/src/christmas_proj.nim new file mode 100644 index 0000000..2267a2b --- /dev/null +++ b/src/christmas_proj.nim @@ -0,0 +1,96 @@ +import os +import sequtils +import opengl +import glfw3 as glfw +import gfx/window as gfx_window +import gfx/glutils as glutils + +import lang/ast +import lang/lexer as lexer +import lang/parser as parser +import lang/tokens + +proc key_down(window: glfw.Window, key, scancode, action, modifier: cint) {.cdecl.} = + if key == glfw.KEY_ESCAPE and action == glfw.PRESS: + glfw.SetWindowShouldClose(window, glfw.TRUE) + +proc main2() = + let window = gfxWindow.NewWindow(800, 600, "ASDF") + + window.SetKeyCallback(key_down) + + var version = cast[cstring](glGetString(GL_VERSION)) + echo $version + + let vertex_shader = glutils.CreateShader(glutils.stVertex, "./data/shaders/basic.vert") + let fragment_shader = glutils.CreateShader(glutils.stFragment, "./data/shaders/basic.frag") + let program = glutils.LinkProgram(vertex_shader, fragment_shader) + glUseProgram(program) + + var vao: GLuint + var temp_vao: GLuint + glGenVertexArrays(1.GLsizei, vao.addr) + glGenVertexArrays(1.GLsizei, temp_vao.addr) + + var vbo: GLuint + var cbo: GLuint + var ibo: GLuint + glGenBuffers(1.GLsizei, vbo.addr) + glGenBuffers(1.GLsizei, cbo.addr) + glGenBuffers(1.GLsizei, ibo.addr) + + glBindVertexArray(vao) + glEnableVertexAttribArray(0) + glEnableVertexAttribArray(1) + + var vertex_data: array[6, GLfloat] = [ + 0'f32, 0'f32, + 0'f32, 1'f32, + 1'f32, 0'f32, + ] + glBindBuffer(GL_ARRAY_BUFFER, vbo) + glBufferData(GL_ARRAY_BUFFER, vertex_data.sizeof, vertex_data.addr, GL_STATIC_DRAW) + glVertexAttribPointer(0, 2, cGL_FLOAT, GL_FALSE, 8.GLsizei, nil) + + var color_data: array[8, GLfloat] = [ + 1'f32, 0'f32, 1'f32, 1'f32, + 0'f32, 1'f32, 0'f32, 1'f32, + ] + glBindBuffer(GL_ARRAY_BUFFER, cbo) + glBufferData(GL_ARRAY_BUFFER, color_data.sizeof, color_data.addr, GL_STATIC_DRAW) + glVertexAttribDivisor(1, 1) + glVertexAttribPointer(1, 4, cGL_FLOAT, GL_FALSE, 16.GLsizei, nil) + + var index_data: array[3, GLuint] = [ + 0.GLuint, 1.Gluint, 2.Gluint, + ] + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo) + glBufferData(GL_ELEMENT_ARRAY_BUFFER, index_data.sizeof, index_data.addr, GL_STATIC_DRAW) + + glBindVertexArray(0) + + while not window.ShouldClose(): + glClearColor(0, 0, 0, 1) + glClear(GL_COLOR_BUFFER_BIT) + + glBindVertexArray(vao) + glDrawElementsInstanced(GL_TRIANGLES, 3.GLsizei, GL_UNSIGNED_INT, nil, 2) + glBindVertexArray(0) + + window.Refresh() + + window.CloseWindow() + +proc main() = + let source_code = readFile("data/progs/test.lgt") + let tokens = toSeq(lexer.GenerateTokens(source_code)) + for token in tokens: + echo token + + echo "\n\n\n" + + for exp in parser.ParseTokens(tokens): + echo exp + +when isMainModule: + main() diff --git a/src/gfx/glutils.nim b/src/gfx/glutils.nim new file mode 100644 index 0000000..10f9cf0 --- /dev/null +++ b/src/gfx/glutils.nim @@ -0,0 +1,71 @@ +import os +import opengl + +type + ShaderType* = enum + stVertex, stFragment + +proc Compile_shader*(shaderType: ShaderType, source: cstringArray): GLuint = + let s_type = + case shaderType + of stVertex: + GL_VERTEX_SHADER + of stFragment: + GL_FRAGMENT_SHADER + + let shader = glCreateShader s_type + glShaderSource shader, 1, source, nil + glCompileShader shader + + var status: GLint + glGetShaderiv shader, GL_COMPILE_STATUS, status.addr + if status == 0: + var logSize: GLint + glGetShaderiv shader, GL_INFO_LOG_LENGTH, logSize.addr + + var + errorMsg = cast[ptr GLchar](alloc logSize) + logLen: GLsizei + + glGetShaderInfoLog shader, logSize.GLsizei, logLen.addr, errorMsg + + echo "Error compiling shader: " & $errorMsg + + dealloc errorMsg + return 0 + + return shader + +proc Create_shader*(shaderType: ShaderType, fileLocation: string): GLuint = + let source = readFile fileLocation + let c_string = allocCStringArray([source]) + + # Dealloc the string when the procedure returns + defer: deallocCStringArray(c_string) + + return Compile_shader(shaderType, c_string) + +proc Link_program*(vertex_shader, fragment_shader: GLuint): GLuint = + let program = glCreateProgram() + glAttachShader program, vertex_shader + glAttachShader program, fragment_shader + glLinkProgram program + + var status: GLint + glGetProgramiv program, GL_LINK_STATUS, status.addr + if status == 0: + var logSize: GLint + glGetProgramiv program, GL_INFO_LOG_LENGTH, logSize.addr + + var + errorMsg = cast[ptr GLchar](alloc logSize) + logLen: GLsizei + + glGetProgramInfoLog program, logSize.GLsizei, logLen.addr, errorMsg + + echo "Error linking program: " & $errorMsg + + dealloc errorMsg + return 0 + + return program diff --git a/src/gfx/window.nim b/src/gfx/window.nim new file mode 100644 index 0000000..6a80640 --- /dev/null +++ b/src/gfx/window.nim @@ -0,0 +1,56 @@ +import glfw3 as glfw +import opengl + +type + Window* = object + window: glfw.Window + width, height: cint + title: cstring + + +proc New_window*(width, height: cint, title: cstring): Window = + # Initialize GLFW + if glfw.Init() != glfw.TRUE: + echo "Failed to initialize GLFW" + return + + # Setup error callback for OpenGL + # May use logging system in the future + discard glfw.SetErrorCallback do (errorCode: cint, description: cstring) {.cdecl.}: + echo "GLFW Error: " & $description + + # Create the window + let window = glfw.CreateWindow(width, height, title, nil, nil) + + # Check for failed window creation + if window == nil: + echo "Window or context creation failed" + + # Use the window for OpenGL operations + glfw.MakeContextCurrent(window) + glfw.SwapInterval(0) + + # Initialize OpenGL + opengl.loadExtensions() + + # Create the wrapper around our window + let m_window = Window(window: window, width: width, height: height, title: title) + + return m_window + +func Get_size*(window: Window): (int, int) {.inline.} = + (int(window.width), int(window.height)) + +proc Set_key_callback*(window: Window, callback: glfw.KeyFun) {.inline.} = + discard glfw.SetKeyCallback(window.window, callback) + +proc Should_close*(window: Window): bool {.inline.} = + glfw.WindowShouldClose(window.window) == glfw.TRUE + +proc Refresh*(window: Window) = + glfw.SwapBuffers(window.window) + glfw.PollEvents() + +proc Close_window*(window: Window) = + glfw.DestroyWindow(window.window) + glfw.Terminate() \ No newline at end of file diff --git a/src/lang/ast.nim b/src/lang/ast.nim new file mode 100644 index 0000000..1836b56 --- /dev/null +++ b/src/lang/ast.nim @@ -0,0 +1,49 @@ +import ./types +import ./tokens + +type + LightExprType* = enum + leNull = 0, + leVar = 1, + leNumLit = 2, + leOp = 3, + leAssign = 4, + leLabel = 5, + leGoto = 6, + leIf = 7, + leWhile = 8, + leBreak = 9 + + LightExpr* = ref object + case kind*: LightExprType + of leVar: + var_name*: LightVariable + of leNumLit: + value*: LightInt + of leOp: + left*: LightExpr + right*: LightExpr + operation*: LightOperation + of leAssign: + variable*: LightVariable + expression*: LightExpr + of leLabel, leGoto: + label*: string + of leIf, leWhile: + condition*: LightExpr + body*: seq[LightExpr] + else: + discard + +proc `$`*(exp: LightExpr): string = + case exp.kind: + of leVar: "Var[" & $exp.var_name & "]" + of leNumLit: "Num[" & $exp.value & "]" + of leOp: "Operation[" & $exp.operation & ", " & $exp.left & ", " & $exp.right & "]" + of leAssign: "Assignment[" & $exp.variable & ", " & $exp.expression & "]" + of leLabel: "Label[" & $exp.label & "]" + of leGoto: "Goto[" & $exp.label & "]" + of leIf: "If[" & $exp.condition & " -> " & $exp.body & "]" + of leWhile: "While[" & $exp.condition & " -> " & $exp.body & "]" + of leBreak: "Break" + else: "" \ No newline at end of file diff --git a/src/lang/lexer.nim b/src/lang/lexer.nim new file mode 100644 index 0000000..197acb7 --- /dev/null +++ b/src/lang/lexer.nim @@ -0,0 +1,88 @@ +import strutils +import parseutils +import sequtils + +import ./types +import ./tokens + +iterator Generate_tokens*(source: string): LightToken = + for token, is_sep in strutils.tokenize(source, {' ', '\n', ';', '\t', '='}): + if is_sep: + if token.contains({'\n', ';'}): + yield LightToken(kind: ltExprDelim) + if token.contains({'='}): + yield LightToken(kind: ltEq) + continue + + if token.startsWith('$'): + let varString = token[1 .. ^1] + var varName: LightVariable + + if varString == "": + raise newException(IOError, "Expected variable name") + else: + if varString == "MEM_1": varName = var1 + elif varString == "MEM_2": varName = var2 + elif varString == "MEM_3": varName = var3 + elif varString == "MEM_4": varName = var4 + elif varString == "MEM_5": varName = var5 + elif varString == "MEM_6": varName = var6 + elif varString == "MEM_7": varName = var7 + elif varString == "MEM_8": varName = var8 + else: + raise newException(IOError, "Invalid variable name.") + + yield LightToken(kind: ltVar, var_name: varName) + + elif token == "=": + yield LightToken(kind: ltEq) + + elif token.isDigit: + var value: int + discard parseutils.parseInt(token, value) + + yield LightToken(kind: ltNum, value: value.LightInt) + + elif token.toLowerAscii == "if": + yield LightToken(kind: ltIf) + elif token.toLowerAscii == "while": + yield LightToken(kind: ltWhile) + elif token.toLowerAscii == "break": + yield LightToken(kind: ltBreak) + elif token.toLowerAscii == "then" or token.toLowerAscii == "do" or token == "{": + yield LightToken(kind: ltBlockStart) + elif token.toLowerAscii == "end" or token == "}": + yield LightToken(kind: ltBlockEnd) + + elif token.toLowerAscii == "goto": + yield LightToken(kind: ltGoto) + elif token.startsWith(':'): + let labelName = token[1 .. ^1] + yield LightToken(kind: ltLabel, label_name: labelName) + + else: + case token: + of "+": + yield LightToken(kind: ltOp, operation: loAdd) + of "-": + yield LightToken(kind: ltOp, operation: loSub) + of "*": + yield LightToken(kind: ltOp, operation: loMul) + of "/": + yield LightToken(kind: ltOp, operation: loDiv) + of "%": + yield LightToken(kind: ltOp, operation: loMod) + of "<": + yield LightToken(kind: ltOp, operation: loLt) + of "<=": + yield LightToken(kind: ltOp, operation: loLte) + of ">": + yield LightToken(kind: ltOp, operation: loGt) + of ">=": + yield LightToken(kind: ltOp, operation: loGte) + of "==": + yield LightToken(kind: ltOp, operation: loEq) + of "~=": + yield LightToken(kind: ltOp, operation: loNeq) + else: + raise newException(IOError, "Invalid token") diff --git a/src/lang/parser.nim b/src/lang/parser.nim new file mode 100644 index 0000000..6de13b5 --- /dev/null +++ b/src/lang/parser.nim @@ -0,0 +1,122 @@ + +import ./types +import ./tokens +import ./ast + +import ../utils/iter + +type + LightParser* = object + tokens: Iter[LightToken] + +func CreateParser*(tokens: Iter[LightToken]): LightParser = + LightParser(tokens: tokens) +func CreateParser*(tokens: seq[LightToken]): LightParser = + CreateParser(CreateIter[LightToken](tokens, LightToken(kind: ltNull))) + +func NextExpr*(parser: LightParser, prev: LightExpr, stop_at: set[LightTokenType]): LightExpr + +func Parse_block(tokens: Iter[LightToken]): seq[LightExpr] = + result = @[] + + var last = tokens.Current + if last.kind == ltBlockEnd: + tokens.Step() + return + + var parser = CreateParser(tokens) + while last.kind != ltBlockEnd: + let p = parser.NextExpr(LightExpr(kind: leNull), {ltExprDelim, ltBlockEnd}) + if p.kind != leNull: + result.add(p) + last = parser.tokens.Current + parser.tokens.Step() + +func NextExpr*(parser: LightParser, prev: LightExpr, stop_at: set[LightTokenType]): LightExpr = + let curr = parser.tokens.Current + + if curr.kind in stop_at: + return prev + + parser.tokens.Step() + + if curr.kind in {ltNum, ltVar} and prev.kind == leNull: + let prevExpr = + case curr.kind: + of ltNum: LightExpr(kind: leNumLit, value: curr.value) + of ltVar: LightExpr(kind: leVar, var_name: curr.var_name) + else: LightExpr(kind: leNull) + + return parser.NextExpr(prevExpr, stop_at) + + elif curr.kind == ltOp: + let next = parser.NextExpr(LightExpr(kind: leNull), stop_at) + return LightExpr( + kind: leOp, + left: prev, + right: next, + operation: curr.operation + ) + + elif curr.kind == ltEq: + if prev.kind != leVar: + raise newException(ValueError, "Expected variable on the left of assignment operator") + + let next = parser.NextExpr(LightExpr(kind: leNull), stop_at) + + return LightExpr( + kind: leAssign, + variable: prev.var_name, + expression: next + ) + + elif curr.kind == ltLabel: + return LightExpr( + kind: leLabel, + label: curr.label_name + ) + + elif curr.kind == ltGoto: + let next = parser.tokens.Current + if next.kind != ltLabel: + raise newException(ValueError, "Expected label after goto") + + return LightExpr( + kind: leGoto, + label: next.label_name + ) + + elif curr.kind == ltIf: + let condition = parser.NextExpr(LightExpr(kind: leNull), {ltBlockStart}) + parser.tokens.Step() + let body = Parse_block(parser.tokens) + + return LightExpr( + kind: leIf, + condition: condition, + body: body + ) + + elif curr.kind == ltWhile: + let condition = parser.NextExpr(LightExpr(kind: leNull), {ltBlockStart}) + parser.tokens.Step() + let body = Parse_block(parser.tokens) + + return LightExpr( + kind: leWhile, + condition: condition, + body: body + ) + + elif curr.kind == ltBreak: + return LightExpr( + kind: leBreak + ) + +iterator Parse_tokens*(tokens: seq[LightToken]): LightExpr = + var parser = CreateParser(tokens) + while not parser.tokens.ReachedEnd: + let next = parser.NextExpr(LightExpr(kind: leNull), {ltExprDelim}) + if next.kind != leNull: + yield next + parser.tokens.Step() diff --git a/src/lang/tokens.nim b/src/lang/tokens.nim new file mode 100644 index 0000000..7fd56ea --- /dev/null +++ b/src/lang/tokens.nim @@ -0,0 +1,52 @@ +import ./types + +type + LightTokenType* = enum + ltNull, + ltVar, ltNum, + ltExprDelim, + ltLabel, ltGoto, + ltIf, ltWhile, ltBlockStart, ltBlockEnd, + ltBreak, + ltOp, ltEq + + LightToken* = ref object + case kind*: LightTokenType + of ltVar: + var_name*: LightVariable + of ltNum: + value*: LightInt + of ltLabel: + label_name*: string + of ltOp: + operation*: LightOperation + else: + discard + +func `$`*(variable: LightVariable): string = + case variable: + of var1: "MEM_1" + of var2: "MEM_2" + of var3: "MEM_3" + of var4: "MEM_4" + of var5: "MEM_5" + of var6: "MEM_6" + of var7: "MEM_7" + of var8: "MEM_8" + +proc `$`*(token: LightToken): string = + return + case token.kind: + of ltNull: "NullToken" + of ltVar: "VarToken[" & $token.var_name & "]" + of ltEq: "EqualsToken" + of ltNum: "NumberToken[" & $token.value & "]" + of ltExprDelim: "ExprDelimToken" + of ltLabel: "LabelToken[" & token.label_name & "]" + of ltGoto: "GotoToken" + of ltIf: "IfToken" + of ltWhile: "WhileToken" + of ltBreak: "BreakToken" + of ltBlockStart: "BlockStartToken" + of ltBlockEnd: "BlockEndToken" + of ltOp: "OpeartionToken[" & $token.operation & "]" \ No newline at end of file diff --git a/src/lang/types.nim b/src/lang/types.nim new file mode 100644 index 0000000..2ba8c9a --- /dev/null +++ b/src/lang/types.nim @@ -0,0 +1,10 @@ +type + LightVariable* = enum + var1 = 0, var2 = 1, var3 = 2, var4 = 3, + var5 = 4, var6 = 5, var7 = 6, var8 = 7 + + LightOperation* = enum + loAdd, loSub, loMul, loDiv, loMod, + loGt, loGte, loLt, loLte, loEq, loNeq + + LightInt* = int32 diff --git a/src/utils/iter.nim b/src/utils/iter.nim new file mode 100644 index 0000000..42b1966 --- /dev/null +++ b/src/utils/iter.nim @@ -0,0 +1,34 @@ +type + Iter*[T] = ref object + curr: int + list: seq[T] + length: int + empty: T + +proc CreateIter*[T](items: seq[T], empty: T): Iter[T] = + Iter[T](curr: 0, list: items, length: items.len, empty: empty) + +proc Step*[T](iter: Iter[T]) = + iter.curr += 1 + +func ReachedEnd*[T](iter: Iter[T]): bool = + iter.curr >= iter.length + +proc Current*[T](iter: Iter[T]): T = + if iter.curr < 0 or iter.curr >= iter.length: + return iter.empty + + return iter.list[iter.curr] + +proc Previous*[T](iter: Iter[T]): T = + if iter.curr - 1 < 0 or iter.curr - 1 >= iter.length: + return iter.empty + + return iter.list[iter.curr - 1] + +proc Next*[T](iter: Iter[T]): T = + if iter.curr + 1 < 0 or iter.curr + 1 >= iter.length: + return iter.empty + + return iter.list[iter.curr + 1] + -- 2.25.1