CFLAGS += -O0 -g ${INCS} ${CPPFLAGS}
LDFLAGS += ${LIBS}
ARFLAGS = rcs
+MAKEFLAGS = -j
#------------------------------------------------------------------------------
# Build Targets and Rules
source/pkg.o \
source/pprint.o \
source/parser.o \
- source/lexer.o \
source/lex.o \
source/ast.o \
source/types.o \
@echo "Parsing example file..."
./sclpl -Aast < example.src
-.l.c:
- ${LEX} -o $@ $<
-
.c.o:
${CC} ${CFLAGS} -c -o $@ $<
sym_add(&(p->syms), SF_TYPEDEF, "void", VoidType());
sym_add(&(p->syms), SF_TYPEDEF, "bool", UIntType(1u));
sym_add(&(p->syms), SF_TYPEDEF, "byte", UIntType(8u));
-// sym_add(&(p->syms), SF_TYPEDEF, "ushort", UIntType(16u));
-// sym_add(&(p->syms), SF_TYPEDEF, "short", IntType(16u));
-// sym_add(&(p->syms), SF_TYPEDEF, "uint", UIntType(32u));
- sym_add(&(p->syms), SF_TYPEDEF, "int", IntType(32u));
-// sym_add(&(p->syms), SF_TYPEDEF, "ulong", UIntType(64u));
-// sym_add(&(p->syms), SF_TYPEDEF, "long", IntType(64u));
+ sym_add(&(p->syms), SF_TYPEDEF, "int", IntType(64u));
+ sym_add(&(p->syms), SF_TYPEDEF, "uint", UIntType(64u));
sym_add(&(p->syms), SF_TYPEDEF, "float", FloatType(32u));
-// sym_add(&(p->syms), SF_TYPEDEF, "double", FloatType(64u));
sym_add(&(p->syms), SF_TYPEDEF, "string",
ArrayOf(sym_get(&(p->syms), "byte")->type, -1));
}
static int emit_ast(Parser* ctx, int argc, char **argv) {
AST* tree = NULL;
- while(NULL != (tree = toplevel(ctx)))
- pprint_tree(stdout, tree, 0);
+ toplevel(ctx);
return 0;
}
case 'A': Artifact = EOPTARG(usage()); break;
default: usage();
} OPTEND;
-
+ /* initialize the parser */
Parser ctx = {0};
codegen_init(&ctx);
for (; argc; argc--,argv++)
lexfile(&ctx, *argv);
-
/* Execute the main compiler process */
if (0 == strcmp("tok", Artifact)) {
return emit_tokens(&ctx, argc, argv);
}
static Tok* expect_val(Parser* p, TokType type) {
- Tok* tok = NULL;
+ static Tok token = {0};
+ /* perform the match */
if (matches(p, type)) {
- tok = calloc(1, sizeof(Tok));
- *tok = *(peek(p));
+ token = *(peek(p));
p->tok.type = T_NONE;
} else {
error(p, "Unexpected token");
}
- return tok;
+ return &token;
}
/* Grammar Definition
*****************************************************************************/
-AST* toplevel(Parser* p) {
+void toplevel(Parser* p) {
if (matches(p, T_REQUIRES))
require_list(p);
if (matches(p, T_PROVIDES))
provide_list(p);
definition_list(p);
- return NULL;
}
static void require_list(Parser* p) {
accept(p, T_REQUIRES);
expect(p, '(');
while (!matches(p, ')')) {
- expect(p, T_STRING);
- pkg_add_require(&(p->pkg), "required/module");
+ Tok* tok = expect_val(p, T_STRING);
+ pkg_add_require(&(p->pkg), tok->text);
}
expect(p, ')');
}
accept(p, T_PROVIDES);
expect(p, '(');
while (!matches(p, ')')) {
- expect(p, T_ID);
- pkg_add_provide(&(p->pkg), "provided/symbol");
+ Tok* tok = expect_val(p, T_ID);
+ pkg_add_provide(&(p->pkg), tok->text);
}
expect(p, ')');
}
void pkg_add_require(Package* p, char* req)
{
+ Require* rq = malloc(sizeof(Require));
+ rq->path = strdup(req);
+ rq->next = p->requires;
+ p->requires = rq;
}
void pkg_add_provide(Package* p, char* exp)
{
+ Provide* pr = malloc(sizeof(Provide));
+ pr->name = strdup(exp);
+ pr->next = p->provides;
+ p->provides = pr;
}
void pkg_add_definition(Package* p, AST* ast)
char* name;
} Provide;
-typedef struct File {
- struct File* next;
- char* name;
- SymTable* syms;
-} File;
+typedef struct Definition {
+ struct Provide* next;
+ AST* ast;
+} Definition;
typedef struct {
char* name;
SymTable* syms;
- File* files;
+ Require* requires;
+ Provide* provides;
+ Definition* definitions;
} Package;
void pkg_add_require(Package* p, char* req);
void lexfile(Parser* ctx, char* path);
void lex(Parser* ctx);
void gettoken(Parser* ctx);
-AST* toplevel(Parser* p);
+void toplevel(Parser* p);
void codegen_init(Parser* p);
/* Option Parsing