-def main(args string[]) int
- 0
-end
+package main
+requires ("fmt")
+provides (main)
+
+let const_true bool = true
+let const_false bool = false
+let const_uint int = 123
+let const_string string = ""
+
+var const_true bool = true
+var const_false bool = false
+var const_uint int = 123
+var const_string string = ""
+
+
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, "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, "ulong", UIntType(64u));
+// sym_add(&(p->syms), SF_TYPEDEF, "long", IntType(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, "double", FloatType(64u));
sym_add(&(p->syms), SF_TYPEDEF, "string",
ArrayOf(sym_get(&(p->syms), "byte")->type, -1));
}
[ \t\r\n] { /* whitespace is insignificant */ }
<<EOF>> { return T_END_FILE; }
-"let" { return T_LET; }
-"var" { return T_VAR; }
+"package" { return T_PACKAGE; }
+"requires" { return T_REQUIRES; }
+"provides" { return T_PROVIDES; }
+"let" { return T_LET; }
+"var" { return T_VAR; }
+"fun" { return T_FUN; }
"if" { return T_IF; }
"then" { return T_THEN; }
#include <sclpl.h>
#include <stdarg.h>
+static void require_list(Parser* p);
+static void provide_list(Parser* p);
+static AST* definition_list(Parser* p);
static AST* const_definition(Parser* p, bool constant);
+static AST* type_definition(Parser* p);
+static AST* func_definition(Parser* p);
static AST* const_expression(Parser* p);
static AST* definition(Parser* p);
static AST* expression(Parser* p);
/* Grammar Definition
*****************************************************************************/
AST* toplevel(Parser* p) {
- AST* ret = NULL;
- if (!match(p, T_END_FILE)) {
+ expect(p, T_PACKAGE);
+ expect(p, T_ID);
+ if (accept(p, T_REQUIRES))
+ require_list(p);
+ if (accept(p, T_PROVIDES))
+ provide_list(p);
+ definition_list(p);
+ return NULL;
+}
+
+static void require_list(Parser* p) {
+ expect(p, T_LPAR);
+ while (peek(p)->type != T_RPAR) {
+ expect(p, T_STRING);
+ }
+ expect(p, T_RPAR);
+}
+
+static void provide_list(Parser* p) {
+ expect(p, T_LPAR);
+ while (peek(p)->type != T_RPAR) {
+ expect(p, T_ID);
+ }
+ expect(p, T_RPAR);
+}
+
+static AST* definition_list(Parser* p) {
+ while (!match(p, T_END_FILE)) {
TokType type = peek(p)->type;
- if (accept(p, T_LET) || accept(p, T_VAR))
- ret = const_definition(p, (type == T_LET));
-// else if (accept(p, T_TYPE))
-// ret = type_definition(p);
-// else if (accept(p, T_FUN))
-// ret = func_definition(p);
- else
+ if (accept(p, T_LET) || accept(p, T_VAR)) {
+ const_definition(p, (type == T_LET));
+ } else if (accept(p, T_TYPE)) {
+ type_definition(p);
+ } else if (accept(p, T_FUN)) {
+ func_definition(p);
+ } else {
error(p, "only definitions are allowed at the toplevel");
+ }
}
- return ret;
+ return NULL;
}
static AST* const_definition(Parser* p, bool constant) {
return Var(id, expr, constant);
}
+static AST* type_definition(Parser* p) {
+ return NULL;
+}
+
+static AST* func_definition(Parser* p) {
+ return NULL;
+
+}
+
static AST* const_expression(Parser* p) {
AST* expr = NULL;
if (accept(p, T_LPAR)) {
/* Token Types
*****************************************************************************/
typedef enum {
- T_NONE, T_ERROR, T_END_FILE, T_LET, T_VAR,
+ T_NONE, T_ERROR, T_END_FILE,
+ T_PACKAGE, T_REQUIRES, T_PROVIDES, T_LET, T_VAR, T_FUN, T_TYPE,
T_ID, T_CHAR, T_INT, T_FLOAT, T_BOOL, T_STRING,
T_LBRACE, T_RBRACE, T_LBRACK, T_RBRACK, T_LPAR, T_RPAR, T_COMMA, T_SQUOTE,
T_DQUOTE, T_END, T_COLON, T_AMP, T_IF, T_THEN, T_ELSE, T_ASSIGN