Do some more stuff
This commit is contained in:
40
README.md
Normal file
40
README.md
Normal 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
|
||||
11
src/parser.c
11
src/parser.c
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user