瀏覽代碼

Add readme

pull/1/head
Malte Schmitz 9 年之前
父節點
當前提交
92766f7957
共有 1 個文件被更改,包括 78 次插入0 次删除
  1. +78
    -0
      README.md

+ 78
- 0
README.md 查看文件

@@ -0,0 +1,78 @@
# Parser and Interpreter for While Programs

Exemplary Java implementation of a _recursive decent parser_, an _abstract syntax tree (AST) data structure_ and a _structural recursive interpreter_ over this data structure.

The purpose of this code is to demonstrate the concepts of _syntax and semantics_. For this purpose a little and very artificial but nevertheless Turing-complete programming language was defined.

The example code in the file `mult.whl` multiplies two integers using addition:

```
a := 2;
b := 4;
r := 0;
while (a) {
r := r + b ;
a := a - 1
}
```

## Literate Programming Documentation

The code is documented in a literate programming style using [Atlassian Docco](https://bitbucket.org/doklovic_atlassian/atlassian-docco)

Have a look a the [Parser](https://malteschmitz.github.io/WhileInterpreter/docco/vertical/src/main/java/parser/Parser.java.html) and the [Interpreter](https://malteschmitz.github.io/WhileInterpreter/docco/vertical/src/main/java/interpreter/Interpreter.java.html) where the formal syntax and semantics are defined, too.

## Building

The maven project can be build with

```
mvn compile
```

which compiles the Java code and automatically generates the docco documentation in `target/docco`.

Without maven you can compile the Java code manually as follows:

```
mkdir -p target/classes
javac -d target/classes src/main/java/*.java src/main/java/**/*.java
```

## Running

You can the example code in `mult.whl` with

```
java -cp target/classes Main mult.whl
```

The expected output is

```
{a=0, b=4, r=8}
```

## Exercise

In order to understand how this little application works, I suggest trying to extend is. For example you could try to implement the `++` operator which increments a variable. This has to be done in three steps

1. Add a class `Increment` in the `program` package with the attribute `identifier` of type `Identifier` storing the name of the variable that will be incremented.

2. Update the `Parser` by extending the `Stmt` rule

```
Stmt = ... | Id "++"
```

3. Update the `Interpreter` by extending the `sem` function either by rewriting the increment operator as an assignment

```
sem(x "++", v) = sem(x ":=" x "+" 1, v)
```

or by directly applying the incrementation

```
sem(x "++", v) = v.update(x, v(x) + 1)
```

Loading…
取消
儲存