mirror of
https://github.com/samsonjs/lake.git
synced 2026-04-27 14:57:43 +00:00
parse comments as values
This commit is contained in:
parent
3015167a30
commit
412f85a73b
9 changed files with 87 additions and 9 deletions
2
Makefile
2
Makefile
|
|
@ -2,7 +2,7 @@ CC = gcc
|
||||||
CFLAGS := -Wall -g $(shell pkg-config --cflags glib-2.0)
|
CFLAGS := -Wall -g $(shell pkg-config --cflags glib-2.0)
|
||||||
LFLAGS := $(shell pkg-config --libs glib-2.0)
|
LFLAGS := $(shell pkg-config --libs glib-2.0)
|
||||||
OBJS = lake.o env.o int.o string.o sym.o parse.o bool.o list.o eval.o \
|
OBJS = lake.o env.o int.o string.o sym.o parse.o bool.o list.o eval.o \
|
||||||
symtable.o fn.o dlist.o primitive.o
|
symtable.o fn.o dlist.o primitive.o comment.o
|
||||||
|
|
||||||
all: lake
|
all: lake
|
||||||
|
|
||||||
|
|
|
||||||
36
comment.c
Normal file
36
comment.c
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
/**
|
||||||
|
* comment.c
|
||||||
|
* Lake Scheme
|
||||||
|
*
|
||||||
|
* Copyright 2011 Sami Samhuri
|
||||||
|
* MIT License
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "comment.h"
|
||||||
|
#include "lake.h"
|
||||||
|
|
||||||
|
static LakeComment *comment_alloc(void)
|
||||||
|
{
|
||||||
|
LakeComment *comment = g_malloc(sizeof(LakeComment));
|
||||||
|
VAL(comment)->type = TYPE_COMM;
|
||||||
|
VAL(comment)->size = sizeof(LakeComment);
|
||||||
|
return comment;
|
||||||
|
}
|
||||||
|
|
||||||
|
LakeComment *comment_make(LakeStr *text)
|
||||||
|
{
|
||||||
|
LakeComment *comment = comment_alloc();
|
||||||
|
comment->text = text;
|
||||||
|
return comment;
|
||||||
|
}
|
||||||
|
|
||||||
|
LakeComment *comment_from_c(char *text)
|
||||||
|
{
|
||||||
|
return comment_make(str_from_c(text));
|
||||||
|
}
|
||||||
|
|
||||||
|
char *comment_repr(LakeComment *comment)
|
||||||
|
{
|
||||||
|
return g_strdup(STR_S(comment->text));
|
||||||
|
}
|
||||||
19
comment.h
Normal file
19
comment.h
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
/**
|
||||||
|
* comment.h
|
||||||
|
* Lake Scheme
|
||||||
|
*
|
||||||
|
* Copyright 2011 Sami Samhuri
|
||||||
|
* MIT License
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _LAKE_COMMENT_H
|
||||||
|
#define _LAKE_COMMENT_H 1
|
||||||
|
|
||||||
|
#include "lake.h"
|
||||||
|
|
||||||
|
LakeComment *comment_make(LakeStr *text);
|
||||||
|
LakeComment *comment_from_c(char *text);
|
||||||
|
char *comment_repr(LakeComment *comment);
|
||||||
|
|
||||||
|
#endif
|
||||||
4
eval.c
4
eval.c
|
|
@ -221,6 +221,10 @@ LakeVal *eval(Env *env, LakeVal *expr)
|
||||||
result = NULL;
|
result = NULL;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case TYPE_COMM:
|
||||||
|
result = NULL;
|
||||||
|
break;
|
||||||
|
|
||||||
case TYPE_LIST:
|
case TYPE_LIST:
|
||||||
list = LIST(expr);
|
list = LIST(expr);
|
||||||
|
|
||||||
|
|
|
||||||
5
lake.c
5
lake.c
|
|
@ -14,6 +14,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/select.h>
|
#include <sys/select.h>
|
||||||
|
#include "comment.h"
|
||||||
#include "env.h"
|
#include "env.h"
|
||||||
#include "eval.h"
|
#include "eval.h"
|
||||||
#include "lake.h"
|
#include "lake.h"
|
||||||
|
|
@ -144,6 +145,10 @@ char *repr(LakeVal *expr)
|
||||||
s = fn_repr(FN(expr));
|
s = fn_repr(FN(expr));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case TYPE_COMM:
|
||||||
|
s = comment_repr(COMM(expr));
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
printf("error: unrecognized value, type %d, size %zu bytes", expr->type, expr->size);
|
printf("error: unrecognized value, type %d, size %zu bytes", expr->type, expr->size);
|
||||||
s = g_strdup("");
|
s = g_strdup("");
|
||||||
|
|
|
||||||
13
lake.h
13
lake.h
|
|
@ -25,6 +25,7 @@ typedef int LakeType;
|
||||||
#define TYPE_DLIST 6
|
#define TYPE_DLIST 6
|
||||||
#define TYPE_PRIM 7
|
#define TYPE_PRIM 7
|
||||||
#define TYPE_FN 8
|
#define TYPE_FN 8
|
||||||
|
#define TYPE_COMM 9
|
||||||
|
|
||||||
#define VAL(x) ((LakeVal *)x)
|
#define VAL(x) ((LakeVal *)x)
|
||||||
#define SYM(x) ((LakeSym *)x)
|
#define SYM(x) ((LakeSym *)x)
|
||||||
|
|
@ -35,6 +36,7 @@ typedef int LakeType;
|
||||||
#define DLIST(x) ((LakeDottedList *)x)
|
#define DLIST(x) ((LakeDottedList *)x)
|
||||||
#define PRIM(x) ((LakePrimitive *)x)
|
#define PRIM(x) ((LakePrimitive *)x)
|
||||||
#define FN(x) ((LakeFn *)x)
|
#define FN(x) ((LakeFn *)x)
|
||||||
|
#define COMM(x) ((LakeComment *)x)
|
||||||
|
|
||||||
struct lake_val {
|
struct lake_val {
|
||||||
LakeType type;
|
LakeType type;
|
||||||
|
|
@ -135,6 +137,14 @@ struct lake_fn {
|
||||||
};
|
};
|
||||||
typedef struct lake_fn LakeFn;
|
typedef struct lake_fn LakeFn;
|
||||||
|
|
||||||
|
struct lake_comment {
|
||||||
|
LakeVal base;
|
||||||
|
LakeStr *text;
|
||||||
|
};
|
||||||
|
typedef struct lake_comment LakeComment;
|
||||||
|
|
||||||
|
#define COMM_TEXT(x) (x->text)
|
||||||
|
|
||||||
char *repr(LakeVal *val);
|
char *repr(LakeVal *val);
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
@ -150,7 +160,6 @@ char *repr(LakeVal *val);
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
#include "dlist.h"
|
#include "dlist.h"
|
||||||
#include "fn.h"
|
#include "fn.h"
|
||||||
|
#include "comment.h"
|
||||||
#include "bootstrap.h"
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
15
parse.c
15
parse.c
|
|
@ -299,14 +299,19 @@ static gboolean is_not_newline(char c)
|
||||||
return !is_newline(c);
|
return !is_newline(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void parse_comment(Ctx *ctx)
|
static LakeVal *parse_comment(Ctx *ctx)
|
||||||
{
|
{
|
||||||
g_free(parse_while(ctx, is_not_newline));
|
char *text = parse_while(ctx, is_not_newline);
|
||||||
|
LakeComment *comment = comment_from_c(text);
|
||||||
|
g_free(text);
|
||||||
|
return VAL(comment);
|
||||||
}
|
}
|
||||||
|
|
||||||
static LakeVal *_parse_expr(Ctx *ctx)
|
static LakeVal *_parse_expr(Ctx *ctx)
|
||||||
{
|
{
|
||||||
LakeVal *result = NULL;
|
maybe_spaces(ctx);
|
||||||
|
|
||||||
|
LakeVal *result;
|
||||||
char c = peek(ctx);
|
char c = peek(ctx);
|
||||||
/* try to parse a number, if that fails parse a symbol */
|
/* try to parse a number, if that fails parse a symbol */
|
||||||
if ((c >= '0' && c <= '9') || c == '-' || c == '+') {
|
if ((c >= '0' && c <= '9') || c == '-' || c == '+') {
|
||||||
|
|
@ -328,10 +333,10 @@ static LakeVal *_parse_expr(Ctx *ctx)
|
||||||
result = parse_list(ctx);
|
result = parse_list(ctx);
|
||||||
}
|
}
|
||||||
else if (c == ';') {
|
else if (c == ';') {
|
||||||
parse_comment(ctx);
|
result = parse_comment(ctx);
|
||||||
}
|
}
|
||||||
else if (c == PARSE_EOF) {
|
else if (c == PARSE_EOF) {
|
||||||
/* noop */
|
result = NULL;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ERR("unexpected char '%c'", c);
|
ERR("unexpected char '%c'", c);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue