This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
cs330_f2016:lab16 [2016/11/26 19:12] morse |
cs330_f2016:lab16 [2018/04/06 02:31] morse |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ** This is a draft version of the assignment. Do not start on it until this line is removed. ** | ||
====Objective:==== | ====Objective:==== | ||
Line 8: | Line 7: | ||
====Deliverable:==== | ====Deliverable:==== | ||
- | Implement the CITypes interpreter using the provided shell. | + | Implement the CITypes interpreter using [[http://liftothers.org/dokuwiki/doku.php?id=cs330_f2016:lab16shell|the provided shell]]. |
=== Language Overview === | === Language Overview === | ||
- | The CITypes language is based on the CI5 language, just like your Extended Interpreter. | + | The CITypes language is based on the CI3 language, just like your Extended Interpreter. |
** You do not need to add any functionality from your previous assignments. ** | ** You do not need to add any functionality from your previous assignments. ** | ||
Line 26: | Line 25: | ||
The language also requires that the types of formal parameters be specified with the function is declared: | The language also requires that the types of formal parameters be specified with the function is declared: | ||
- | <code> | + | <code lisp> |
(lambda <id> : <type> <expr>) | (lambda <id> : <type> <expr>) | ||
</code> | </code> | ||
Line 32: | Line 31: | ||
For example, a simple numeric increment function would be written as | For example, a simple numeric increment function would be written as | ||
- | <code> | + | <code lisp> |
- | (lambda x : number (+ x 1) | + | (lambda x : number (+ x 1)) |
</code> | </code> | ||
- | and a function that takes as input a function from numbers to numbers would look like this: | + | and a function lambda that takes as input a function f from numbers to numbers would look like this: |
- | <code> | + | <code lisp> |
(lambda f : (number : number) (f 3)) | (lambda f : (number : number) (f 3)) | ||
</code> | </code> | ||
Line 50: | Line 49: | ||
Here is the grammar for the CITypes language: | Here is the grammar for the CITypes language: | ||
- | <code> | + | <code bnf> |
<expr> ::= <number> | <expr> ::= <number> | ||
| true | | true | ||
Line 64: | Line 63: | ||
| nempty | | nempty | ||
| (ncons <expr> <expr>) | | (ncons <expr> <expr>) | ||
- | | (nempty <expr>) | + | | (nisempty <expr>) |
| (nfirst <expr>) | | (nfirst <expr>) | ||
| (nrest <expr>) | | (nrest <expr>) | ||
Line 94: | Line 93: | ||
** The type checker should perform no evaluation of the code, only type checking. ** | ** The type checker should perform no evaluation of the code, only type checking. ** | ||
+ | |||
+ | In class, we went over [[lab16judgments | the type judgments for the expressions other than those that work with lists]]. | ||
+ | You will need to determine them for the five list-handling expressions yourself. | ||
Some of the tests will involve comparing two types, and a "same_types" function is provided to do a (recursive if necessary) comparison. | Some of the tests will involve comparing two types, and a "same_types" function is provided to do a (recursive if necessary) comparison. | ||
Line 99: | Line 101: | ||
When your type checker catches an error, it should throw an exception with a descriptive error message. | When your type checker catches an error, it should throw an exception with a descriptive error message. | ||
+ | ---- | ||
====Hints:==== | ====Hints:==== | ||
- | * The "calcf" function in the CI5 interpreter that read in a test file, ran it through lex / parse / calc has been replaced with a "typef" function that similarly reads in a test file and runs it through lex / parse / type_of_expression. You can use it to run your own test cases. | + | * The "calcf" function in the CI3 interpreter that read in a test file, ran it through lex / parse / calc has been replaced with a "typef" function that similarly reads in a test file and runs it through lex / parse / type_of_expression. You can use it to run your own test cases. |
* Make sure you test not only for validly typed expressions but for each kind of type error. | * Make sure you test not only for validly typed expressions but for each kind of type error. | ||
- |