Skip to content

Commit 5706f05

Browse files
committed
Initial commit
0 parents  commit 5706f05

File tree

8 files changed

+1137
-0
lines changed

8 files changed

+1137
-0
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
build

COPYING

+674
Large diffs are not rendered by default.

Makefile

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
.POSIX:
2+
.SUFFIXES:
3+
OUTDIR=.build
4+
include $(OUTDIR)/config.mk
5+
include $(OUTDIR)/cppcache
6+
7+
harec: $(harec_objects)
8+
@printf 'CCLD\t$@\n'
9+
@$(CC) $(LDFLAGS) -o $@ $(harec_objects) $(LIBS)
10+
11+
.SUFFIXES: .c .o .scd .1 .5
12+
13+
.c.o:
14+
@printf 'CC\t$@\n'
15+
@touch $(OUTDIR)/cppcache
16+
@grep $< $(OUTDIR)/cppcache >/dev/null || \
17+
$(CPP) $(CFLAGS) -MM -MT $@ $< >> $(OUTDIR)/cppcache
18+
@$(CC) -c $(CFLAGS) -o $@ $<
19+
20+
docs:
21+
22+
clean:
23+
@rm -f harec $(harec_objects)
24+
25+
distclean: clean
26+
@rm -rf "$(OUTDIR)"
27+
28+
install:
29+
30+
.PHONY: docs clean distclean install

config.sh

+198
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
outdir=${OUTDIR:-.build}
2+
srcdir=${SRCDIR:-$(dirname "$0")}
3+
AR=${AR:-ar}
4+
AS=${AS:-as}
5+
CC=${CC:-cc}
6+
CFLAGS=${CFLAGS:-}
7+
LD=${LD:-ld}
8+
SCDOC=${SCDOC:-scdoc}
9+
10+
for arg
11+
do
12+
case "$arg" in
13+
--bindir=*)
14+
BINDIR=${arg#*=}
15+
;;
16+
--libdir=*)
17+
LIBDIR=${arg#*=}
18+
;;
19+
--mandir=*)
20+
MANDIR=${arg#*=}
21+
;;
22+
--prefix=*)
23+
PREFIX=${arg#*=}
24+
if [ "$PREFIX" = "/usr" ]
25+
then
26+
SYSCONFDIR=/etc
27+
fi
28+
;;
29+
--sharedir=*)
30+
SHAREDIR=${arg#*=}
31+
;;
32+
--sysconfdir=*)
33+
SYSCONFDIR=${arg#*=}
34+
;;
35+
esac
36+
done
37+
38+
subdir() {
39+
eval ". $srcdir/$1/configure"
40+
}
41+
42+
genrules() {
43+
target="$1"
44+
shift
45+
printf '# Begin generated rules for %s\n' "$target"
46+
for file in "$@"
47+
do
48+
ext="${file#*.}"
49+
file="${file%.*}"
50+
deps=
51+
printf '%s.o: %s.%s%s\n' "$file" "$file" "$ext" "$deps"
52+
done
53+
printf '%s_objects=\\\n' "$target"
54+
n=0
55+
for file in "$@"
56+
do
57+
file="${file%.*}"
58+
n=$((n+1))
59+
if [ $n -eq $# ]
60+
then
61+
printf '\t%s.o\n' "$file"
62+
else
63+
printf '\t%s.o \\\n' "$file"
64+
fi
65+
done
66+
printf '# End generated rules for %s\n' "$target"
67+
}
68+
69+
append_cflags() {
70+
for flag
71+
do
72+
CFLAGS="$(printf '%s \\\n\t%s' "$CFLAGS" "$flag")"
73+
done
74+
}
75+
76+
test_cflags() {
77+
[ ! -e "$outdir"/check.c ] && cat <<-EOF > "$outdir"/check.c
78+
int main(void) { return 0; }
79+
EOF
80+
werror=""
81+
case "$CFLAGS" in
82+
*-Werror*)
83+
werror="-Werror"
84+
;;
85+
esac
86+
if $CC $werror "$@" -o /dev/null "$outdir"/check.c >/dev/null 2>&1
87+
then
88+
append_cflags "$@"
89+
else
90+
return 1
91+
fi
92+
}
93+
94+
find_library() {
95+
name="$1"
96+
pc="$2"
97+
printf "Checking for %s... " "$name"
98+
if ! pkg-config "$pc" 2>/dev/null
99+
then
100+
printf "NOT FOUND\n"
101+
printf "Tried pkg-config %s\n" "$pc"
102+
return 1
103+
fi
104+
printf "OK\n"
105+
CFLAGS="$CFLAGS $(pkg-config --cflags "$pc")"
106+
LIBS="$LIBS $(pkg-config --libs "$pc")"
107+
}
108+
109+
docs() { true; }
110+
111+
run_configure() {
112+
mkdir -p $outdir
113+
114+
for flag in -g -std=c11 -D_XOPEN_SOURCE=700 \
115+
-Wall -Wextra -Werror -pedantic \
116+
-Wno-unused-parameter
117+
do
118+
printf "Checking for %s... " "$flag"
119+
if test_cflags "$flag"
120+
then
121+
echo yes
122+
else
123+
echo no
124+
fi
125+
done
126+
127+
printf "Checking for scdoc... "
128+
if scdoc -v >/dev/null 2>&1
129+
then
130+
echo yes
131+
all="$all docs"
132+
else
133+
echo no
134+
fi
135+
136+
printf "Creating $outdir/config.mk... "
137+
cat <<-EOF > "$outdir"/config.mk
138+
CC=$CC
139+
SCDOC=$SCDOC
140+
LIBS=$LIBS
141+
PREFIX=${PREFIX:-/usr/local}
142+
OUTDIR=${outdir}
143+
SRCDIR=${srcdir}
144+
BINDIR?=${BINDIR:-\$(PREFIX)/bin}
145+
SHAREDIR?=${SHAREDIR:-\$(PREFIX)/share}
146+
SYSCONFDIR?=${SYSCONFDIR:-\$(PREFIX)/etc}
147+
LIBDIR?=${LIBDIR:-\$(PREFIX)/lib}
148+
MANDIR?=${MANDIR:-\$(PREFIX)/share/man}
149+
VARLIBDIR?=${MANDIR:-\$(PREFIX)/var/lib}
150+
CACHE=\$(OUTDIR)/cache
151+
CFLAGS=${CFLAGS}
152+
CFLAGS+=-Iinclude -I\$(OUTDIR)
153+
CFLAGS+=-DPREFIX='"\$(PREFIX)"'
154+
CFLAGS+=-DLIBDIR='"\$(LIBDIR)"'
155+
CFLAGS+=-DVARLIBDIR='"\$(VARLIBDIR)"'
156+
CFLAGS+=-DSYSCONFDIR='"\$(SYSCONFDIR)"'
157+
158+
all: ${all}
159+
EOF
160+
161+
for target in $all
162+
do
163+
$target >>"$outdir"/config.mk
164+
done
165+
echo done
166+
167+
touch $outdir/cppcache
168+
169+
if [ "$srcdir" = "." ]
170+
then
171+
return
172+
fi
173+
174+
populate() (
175+
path="$1"
176+
mkdir -p "${path#$srcdir/}"
177+
fullpath() ( cd "$1" && pwd )
178+
for orig in "$path"/*
179+
do
180+
link="${orig#$srcdir/}"
181+
if [ -d "$orig" ]
182+
then
183+
mkdir -p $link
184+
populate "$orig"
185+
elif [ -f "$orig" ]
186+
then
187+
ln -sf "$(fullpath "$path")"/"$(basename "$orig")" "$link"
188+
fi
189+
done
190+
)
191+
192+
printf "Populating build dir... "
193+
populate "$srcdir/include"
194+
populate "$srcdir/src"
195+
populate "$srcdir/doc"
196+
ln -sf "$srcdir"/Makefile ./
197+
echo done
198+
}

configure

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#!/bin/sh -e
2+
srcdir=${SRCDIR:-$(dirname "$0")}
3+
eval ". $srcdir/config.sh"
4+
5+
harec() {
6+
genrules harec \
7+
src/lex.c \
8+
src/main.c
9+
}
10+
11+
all="harec"
12+
13+
run_configure

include/lex.h

+126
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
#ifndef HAREC_LEX_H
2+
#define HAREC_LEX_H
3+
4+
// Keep sorted
5+
enum lexical_token {
6+
T_AS,
7+
T_ASSERT,
8+
T_BOOL,
9+
T_BREAK,
10+
T_CHAR,
11+
T_CONST,
12+
T_CONTINUE,
13+
T_DEF,
14+
T_ELSE,
15+
T_ENUM,
16+
T_EXPORT,
17+
T_F32,
18+
T_F64,
19+
T_FALSE,
20+
T_FN,
21+
T_FOR,
22+
T_I16,
23+
T_I32,
24+
T_I64,
25+
T_I8,
26+
T_IF,
27+
T_INT,
28+
T_IS,
29+
T_LEN,
30+
T_LET,
31+
T_MATCH,
32+
T_NULL,
33+
T_NULLABLE,
34+
T_RETURN,
35+
T_SIZE,
36+
T_STATIC,
37+
T_STR,
38+
T_STRUCT,
39+
T_SWITCH,
40+
T_TRUE,
41+
T_U16,
42+
T_U32,
43+
T_U64,
44+
T_U8,
45+
T_UINT,
46+
T_UINTPTR,
47+
T_UNION,
48+
T_USE,
49+
T_VOID,
50+
T_WHILE,
51+
52+
// Operators
53+
T_ANDEQ,
54+
T_BAND,
55+
T_BNOT,
56+
T_BOR,
57+
T_CASE,
58+
T_COLON,
59+
T_COMMA,
60+
T_DIV,
61+
T_DIVEQ,
62+
T_DOT,
63+
T_DOUBLE_COLON,
64+
T_ELLIPSIS,
65+
T_EQUAL,
66+
T_GREATER,
67+
T_GTR_EQL,
68+
T_LAND,
69+
T_LBRACE,
70+
T_LBRACKET,
71+
T_LEQUAL,
72+
T_LESS,
73+
T_LESS_EQL,
74+
T_LNOT,
75+
T_LOR,
76+
T_LPAREN,
77+
T_LSHIFT,
78+
T_LSHIFTEQ,
79+
T_MINUS,
80+
T_MINUSEQ,
81+
T_MODEQ,
82+
T_MODULO,
83+
T_NEQUAL,
84+
T_OREQ,
85+
T_PLUS,
86+
T_PLUSEQ,
87+
T_RBRACE,
88+
T_RBRACKET,
89+
T_RPAREN,
90+
T_RSHIFT,
91+
T_RSHIFTEQ,
92+
T_SEMICOLON,
93+
T_SLICE,
94+
T_TIMES,
95+
T_TIMESEQ,
96+
T_XOREQ,
97+
98+
// Tokens with additional information
99+
T_NAME,
100+
T_LITERAL,
101+
102+
// Magic tokens
103+
T_EOF,
104+
T_ERROR,
105+
};
106+
107+
struct token {
108+
enum lexical_token token;
109+
union {
110+
char *name;
111+
};
112+
};
113+
114+
struct lexer {
115+
FILE *in;
116+
char *buf;
117+
size_t bufsz, buflen;
118+
};
119+
120+
void lex_init(struct lexer *lexer, FILE *f);
121+
int lex(struct lexer *lexer, struct token *out);
122+
123+
void token_finish(struct token *tok);
124+
const char *token_str(const struct token *tok);
125+
126+
#endif

0 commit comments

Comments
 (0)