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
|
// Could be type reference or negative number
|
||||||
if (strlen(token) > 1 && !isdigit(token[1])) {
|
if (strlen(token) > 1 && !isdigit(token[1])) {
|
||||||
// Type reference (e.g., -int, -string)
|
// 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
|
// Try to parse as number
|
||||||
@@ -193,10 +192,10 @@ GroundProgram parseFile(const char* file) {
|
|||||||
// Check if first token is a label
|
// Check if first token is a label
|
||||||
size_t tokenStart = 0;
|
size_t tokenStart = 0;
|
||||||
if (line.tokens[0].text[0] == '@') {
|
if (line.tokens[0].text[0] == '@') {
|
||||||
// TODO: Handle labels - you might want to store them separately
|
GroundInstruction inst = createGroundInstruction(CREATELABEL);
|
||||||
// For now, skip to next token
|
addArgToInstruction(&inst, createRefGroundArg(LABEL, line.tokens[0].text + 1));
|
||||||
tokenStart = 1;
|
addInstructionToProgram(&program, inst);
|
||||||
if (tokenStart >= line.count) continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// First non-label token is the instruction
|
// First non-label token is the instruction
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
typedef enum GroundInstType {
|
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;
|
} GroundInstType;
|
||||||
|
|
||||||
typedef enum GroundValueType {
|
typedef enum GroundValueType {
|
||||||
@@ -16,7 +16,7 @@ typedef enum GroundValueType {
|
|||||||
} GroundValueType;
|
} GroundValueType;
|
||||||
|
|
||||||
typedef enum GroundArgType {
|
typedef enum GroundArgType {
|
||||||
VALUE, VALREF, DIRREF, LINEREF, LABEL, FNREF
|
VALUE, VALREF, DIRREF, LINEREF, LABEL, FNREF, TYPEREF
|
||||||
} GroundArgType;
|
} GroundArgType;
|
||||||
|
|
||||||
struct GroundValue;
|
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