initial commit
This commit is contained in:
4
console.py
Normal file
4
console.py
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
from rich.console import Console
|
||||||
|
|
||||||
|
|
||||||
|
console = Console()
|
23
error.py
Normal file
23
error.py
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
from console import console
|
||||||
|
|
||||||
|
|
||||||
|
def traceback(code: str, error_type: str, error_message: str, line: int | None = None, start_column: int | None = None, end_column: int | None = None):
|
||||||
|
if line != None:
|
||||||
|
console.print(f"[bold red]{error_type} on line {line}: [/]{error_message}\n")
|
||||||
|
lines = code.split("\n")[line-1:line+2]
|
||||||
|
|
||||||
|
console.print(f"{line } > " + lines[0], highlight=False)
|
||||||
|
if start_column != None and end_column != None:
|
||||||
|
console.print(" " + (" " * start_column) + "[bold red]" + ("^" * (end_column-start_column+1)))
|
||||||
|
|
||||||
|
try:
|
||||||
|
console.print(f"{line+1} " + lines[1], highlight=False)
|
||||||
|
console.print(f"{line+2} " + lines[2], highlight=False)
|
||||||
|
console.print(" ...", highlight=False)
|
||||||
|
except IndexError: # the file is less than 3 lines i guess
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
console.print(f"[bold red]{error_type}: {error_message}")
|
||||||
|
|
||||||
|
|
||||||
|
|
19
main.py
Normal file
19
main.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
from tokenizer import tokenize
|
||||||
|
from rich import print
|
||||||
|
from time import time
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
start = time()
|
||||||
|
file = open("test.grnd", "r")
|
||||||
|
code = file.read()
|
||||||
|
file.close()
|
||||||
|
|
||||||
|
tokens = tokenize(code)
|
||||||
|
compile_time = time()-start
|
||||||
|
print(tokens)
|
||||||
|
print(f"Compiled in {compile_time} seconds.")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
79
test.grnd
Normal file
79
test.grnd
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
# checks if the current index in the determiner matches the current index in the target string
|
||||||
|
fun -bool !currentCharsMatch -string &str -string &determiner -int &counter -int &detIndex
|
||||||
|
getstrcharat $str $counter ¤tChar
|
||||||
|
getstrcharat $determiner $detIndex ¤tDetChar
|
||||||
|
equal $currentChar $currentDetChar &equals
|
||||||
|
return $equals
|
||||||
|
endfun
|
||||||
|
|
||||||
|
fun -list !split -string &str -string &determiner
|
||||||
|
# create an empty list
|
||||||
|
setlist *output ""
|
||||||
|
set &counter 0
|
||||||
|
set &detIndex 0
|
||||||
|
set ¤tLoop "" # basically we build out the current token until we reach the determiner
|
||||||
|
getstrsize $str &length
|
||||||
|
getstrsize $determiner &determinerLength
|
||||||
|
|
||||||
|
# go through each char in the string, does it match the first char in our determiner?
|
||||||
|
#@loop
|
||||||
|
# we are technically getting the current char twice
|
||||||
|
# 1. inside the currentCharsMatch function
|
||||||
|
# 2. here
|
||||||
|
# but oh well, it wont be that bad (i hope)
|
||||||
|
getstrcharat $str $counter ¤tChar
|
||||||
|
|
||||||
|
pusharg $str
|
||||||
|
pusharg $determiner
|
||||||
|
pusharg $counter
|
||||||
|
pusharg $detIndex
|
||||||
|
call !currentCharsMatch &equals
|
||||||
|
not $equals &doesntMatch
|
||||||
|
if $doesntMatch %next
|
||||||
|
|
||||||
|
stdlnout "WE HAVE A MATCH"
|
||||||
|
set &detIndex 0
|
||||||
|
# WE HAVE A MATCH BABY, we gotta make sure it matches the whole determiner tho
|
||||||
|
@innerLoop
|
||||||
|
|
||||||
|
pusharg $str
|
||||||
|
pusharg $determiner
|
||||||
|
pusharg $counter
|
||||||
|
pusharg $detIndex
|
||||||
|
call !currentCharsMatch &equals
|
||||||
|
add $detIndex 1 &detIndex
|
||||||
|
equal $detIndex $determinerLength &endOfDet
|
||||||
|
if $endOfDet %append
|
||||||
|
if $equals %innerLoop
|
||||||
|
|
||||||
|
@append
|
||||||
|
listappend *output $currentLoop
|
||||||
|
set ¤tLoop ""
|
||||||
|
set &detIndex 0
|
||||||
|
|
||||||
|
@next
|
||||||
|
add $currentLoop $currentChar ¤tLoop
|
||||||
|
# next character in the string
|
||||||
|
add $counter 1 &counter
|
||||||
|
inequal $length $counter ¬AtEnd
|
||||||
|
stdlnout $notAtEnd
|
||||||
|
if $notAtEnd %loop
|
||||||
|
|
||||||
|
return *output
|
||||||
|
endfun
|
||||||
|
|
||||||
|
pusharg "split this string"
|
||||||
|
pusharg " "
|
||||||
|
call !split *listOut
|
||||||
|
#getlistsize *listOut &length
|
||||||
|
#stdlnout $length
|
||||||
|
|
||||||
|
set &counter 0
|
||||||
|
|
||||||
|
@loopOverList
|
||||||
|
getlistat *listOut $counter ¤tItem
|
||||||
|
stdlnout $currentItem
|
||||||
|
add $counter 1 &counter
|
||||||
|
getlistsize *listOut &length
|
||||||
|
inequal $counter $length ¬Done
|
||||||
|
if $notDone %loopOverList
|
4
test2.grnd
Normal file
4
test2.grnd
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
set &x 0
|
||||||
|
@loop
|
||||||
|
add $x 1 &x
|
||||||
|
jump %loop
|
Reference in New Issue
Block a user