The formal prerequisites in the Iowa State catalog are successful completion of Com S 321, Com S 331, and Com S 361.
Com S 331 is a course in theory of computing. The main skill you need from Com S 331 is the ability to manipulate and work from context free grammars. For example, you should be able to write programs without parse errors using a context free (BNF) grammar for a programming language. In 342 we will extend and deepen your ability and familiarity with grammars.
In language design, questions also arise as to what kinds of mistakes a language can check for; since many such questions are unsolvable, you will sometimes need to apply your knowledge of impossibility results (e.g., the halting problem).
Computer Science 330 (discrete math) is a prerequisite to Com S 331. Several skills taught in Com S 330 are relevant to problem solving in general and to the kind of programming we will do in Com S 342. Familiarity with set theory, and recursive definitions is essential for various manipulations of syntax trees. Also needed are the concepts of the domain and range of a function, the ability to translate English into first-order predicate calculus (and set theory) and vice versa, and the ability to perform simple operations on logical expressions such as negation and simplification. These skills will help in type checking, in algebraic manipulation of programs, and in understanding formalized semantic ideas.
Com S 321 is an introductory course in computer architecture. The knowledge you need from Com S 321 includes an understanding of how data is represented in a computer, and assembly language programming. We will tap this knowledge in Com S 342 and expand on it to paint a more vivid picture of what happens in various programming languages at run time.
Com S 361 is a course in file organization and processing. From Com S 361 you should have an appreciation for the problems of writing and maintaining medium-sized programs. You should also know how to design, modularize, and document a medium-sized program. you should be thoroughly familiar with imperative programming techniques (assignment, looping, etc. as in C++, C, or Pascal).