From 390f1e368cfdc5011e9eb9af76d2fb44cd8dc0b2 Mon Sep 17 00:00:00 2001 From: Leo Tenenbaum Date: Sat, 7 Dec 2019 18:21:03 -0500 Subject: fixed something weird going on with the tokenizer that might be a bug in clang --- docs/00.html | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ docs/00.md | 25 +++++++++++++++++-------- docs/01.html | 18 ++++++++++++++++++ docs/01.md | 18 ++++++++++++++++++ 4 files changed, 114 insertions(+), 8 deletions(-) create mode 100644 docs/00.html create mode 100644 docs/01.html create mode 100644 docs/01.md (limited to 'docs') diff --git a/docs/00.html b/docs/00.html new file mode 100644 index 0000000..cd0c352 --- /dev/null +++ b/docs/00.html @@ -0,0 +1,61 @@ +

Declarations

+ +

In toc, declarations have the following syntax: + +<name> :[:] [type] [= expression]; +

+ +

The square brackets ([]) indicate something optional.

+ +

All of the following statements +declare an new variable x which is an integer, and has a value of 0: + +x : int; +x : int = 0; +x := 0; + +Note that in the first of those statements, although no expression +is specified, it defaults to 0. This is not true in C, +and there will eventually probably be an option to +leave x uninitialized.

+ +

If you wanted x to be a floating-point number, you could use: + +x : float; +x : float = 0; +x := 0.0; +

+ +

Note that 0 can be used as both a float and an integer, but +when no type is specified, it defaults to an int, whereas 0.0 +defaults to a float.

+ +

Here are all of toc's builtin types and their ranges of values:

+ + + +

At the moment, it is not technically guaranteed that f32/float is actually 32-bit and that f64 is actually 64-bit; they are platform dependent. Perhaps someday there will be a version of toc which does not compile to C, where that could be guaranteed.

+ +

To make declarations constant, use :: instead of :. e.g.

+ +

+x ::= 5+3;
+y :: float = 5.123; +

+ +

Here, "constant" means constant at compile time, not read-only as it does in C. One interesting thing about toc is that normal functions can run at compile time, so pretty much any expression is a valid initializer for a constant, e.g. doing x ::= some_function(); runs some_function at compile time, not at run time.

diff --git a/docs/00.md b/docs/00.md index e4e8d41..4998684 100644 --- a/docs/00.md +++ b/docs/00.md @@ -1,8 +1,8 @@ -## Declarations in toc +## Declarations -Declarations have the following syntax: +In toc, declarations have the following syntax: ``` - : [type] [= expression]; + :[:] [type] [= expression]; ``` The square brackets (`[]`) indicate something optional. @@ -41,10 +41,19 @@ Here are all of toc's builtin types and their ranges of values: - `u16` - 16-bit unsigned integer, 0 to 65535 - `u32` - 32-bit unsigned integer, 0 to 4294967295 - `u64` - 64-bit unsigned integer, 0 to 18446744073709551615 -- `float` - A 32-bit floating-point number, -- `f32` -- `f64` -- `bool` -- `char` +- `float` - A 32-bit floating-point number, -3.40282347e+38 to 3.40282347e+38 +- `f32` - A 32-bit floating-point number (same as `float`, but more explicit about the size) +- `f64` - A 64-bit floating-point number, -1.7976931348623157e+308 to 1.7976931348623157e+308 +- `bool` - A boolean value, either `false` or `true`. +- `char` - A character. The specific values are technically platform-dependent, but usually there are 256 of them. At the moment, it is not technically guaranteed that `f32`/`float` is actually 32-bit and that `f64` is actually 64-bit; they are platform dependent. Perhaps someday there will be a version of toc which does not compile to C, where that could be guaranteed. + +To make declarations constant, use `::` instead of `:`. e.g. + +``` +x ::= 5+3; +y :: float = 5.123; +``` + +Here, "constant" means constant at compile time, not read-only as it does in C. One interesting thing about toc is that normal functions can run at compile time, so pretty much any expression is a valid initializer for a constant, e.g. doing `x ::= some_function();` runs `some_function` at compile time, not at run time. diff --git a/docs/01.html b/docs/01.html new file mode 100644 index 0000000..633295b --- /dev/null +++ b/docs/01.html @@ -0,0 +1,18 @@ +

A first program

+ +

The main function in toc corresponds to the main function in C. This function is called when your program is run. So, this is a valid toc program which does nothing:

+ +

+main ::= fn() { +}; +

+ +

It declares a constant, main, which is a function with an empty body. Note that the syntax for declaring functions is the same as the syntax for declaring constants (it isn't something like fn main() { ... }).

+ +

Assuming you have compiled the compiler (see README.md for instructions about that), you can compile it with

+ +

+toc <your filename> +

+ +

You will get a file called out.c, which you can then put through your C compiler to get an executable file which does nothing. Congratulations! You've written your first toc program.

diff --git a/docs/01.md b/docs/01.md new file mode 100644 index 0000000..816f3e6 --- /dev/null +++ b/docs/01.md @@ -0,0 +1,18 @@ +### A first program + +The `main` function in toc corresponds to the `main` function in C. This function is called when your program is run. So, this is a valid toc program which does nothing: + +``` +main ::= fn() { +}; +``` + +It declares a constant, `main`, which is a function with an empty body. Note that the syntax for declaring functions is the same as the syntax for declaring constants (it isn't something like `fn main() { ... }`). + +Assuming you have compiled the compiler (see `README.md` for instructions about that), you can compile it with + +``` +toc +``` + +You will get a file called `out.c`, which you can then put through your C compiler to get an executable file which does nothing. Congratulations! You've written your first toc program. -- cgit v1.2.3