Do some more stuff

This commit is contained in:
2025-11-23 16:32:54 +11:00
parent 451de0affd
commit 31cc30ee48
4 changed files with 56 additions and 9 deletions

40
README.md Normal file
View File

@@ -0,0 +1,40 @@
# Ground, but written in C this time
This repo houses the new Ground interpreter, which will replace the old C++ interpreter.
Features of this interpreter:
* Written in C instead of C++
* Somewhat organised and readable codebase
* Not super buggy (yet)
* Uses standard, portable C*
Now that Ground's features have mostly been finalised, this interpreter can be built with care to many features not initially planned, like functions and data structures
*so far, only tested on Linux, but hopefully should work on other platforms as well
Progress marker:
- [x] Lexer
- [x] Parser
- [x] Labels
- [x] Instructions
- [x] Values
- [x] References
- [ ] Interpreter
- [ ] Labels
- [ ] Console I/O
- [ ] Control flow
- [ ] Data
- [ ] Variable creation
- [ ] Variable access
- [ ] Lists
- [ ] Creation
- [ ] Access
- [ ] String operations
- [ ] Maths
- [ ] Comparisions
- [ ] Type conversions
- [ ] Functions
- [ ] Custom data structures
- [ ] Working with external libraries

View File

@@ -110,9 +110,8 @@ static GroundArg parseArgument(const char* token) {
// Could be type reference or negative number
if (strlen(token) > 1 && !isdigit(token[1])) {
// Type reference (e.g., -int, -string)
return createRefGroundArg(LABEL, token + 1); // Using LABEL for type refs
return createRefGroundArg(TYPEREF, token + 1);
}
// Fall through to number parsing
}
// Try to parse as number
@@ -193,10 +192,10 @@ GroundProgram parseFile(const char* file) {
// Check if first token is a label
size_t tokenStart = 0;
if (line.tokens[0].text[0] == '@') {
// TODO: Handle labels - you might want to store them separately
// For now, skip to next token
tokenStart = 1;
if (tokenStart >= line.count) continue;
GroundInstruction inst = createGroundInstruction(CREATELABEL);
addArgToInstruction(&inst, createRefGroundArg(LABEL, line.tokens[0].text + 1));
addInstructionToProgram(&program, inst);
continue;
}
// First non-label token is the instruction

View File

@@ -8,7 +8,7 @@
#include <string.h>
typedef enum GroundInstType {
IF, JUMP, END, INPUT, PRINT, PRINTLN, SET, GETTYPE, EXISTS, SETLIST, SETLISTAT, GETLISTAT, GETLISTSIZE, LISTAPPEND, GETSTRSIZE, GETSTRCHARAT, ADD, SUBTRACT, MULTIPLY, DIVIDE, EQUAL, INEQUAL, NOT, GREATER, LESSER, STOI, STOD, TOSTRING, FUN, RETURN, ENDFUN, PUSHARG, CALL, STRUCT, ENDSTRUCT, INIT, USE, EXTERN
IF, JUMP, END, INPUT, PRINT, PRINTLN, SET, GETTYPE, EXISTS, SETLIST, SETLISTAT, GETLISTAT, GETLISTSIZE, LISTAPPEND, GETSTRSIZE, GETSTRCHARAT, ADD, SUBTRACT, MULTIPLY, DIVIDE, EQUAL, INEQUAL, NOT, GREATER, LESSER, STOI, STOD, TOSTRING, FUN, RETURN, ENDFUN, PUSHARG, CALL, STRUCT, ENDSTRUCT, INIT, USE, EXTERN, CREATELABEL
} GroundInstType;
typedef enum GroundValueType {
@@ -16,7 +16,7 @@ typedef enum GroundValueType {
} GroundValueType;
typedef enum GroundArgType {
VALUE, VALREF, DIRREF, LINEREF, LABEL, FNREF
VALUE, VALREF, DIRREF, LINEREF, LABEL, FNREF, TYPEREF
} GroundArgType;
struct GroundValue;

View File

@@ -1 +1,9 @@
println "dingus"
@begin
print "Do you like cheese? "
input &userIn
equal $userIn "yes" &cond
if $cond %end
println "That's sad"
jump %begin
@end
println "Yay! I do too"