An Introduction to the C Programming Language and Software Design was written with two primary objectives. The first is to introduce the C programming language. The second key objective is to introduce the basic concepts of software design. At one-level this is C-specific: to learn to design, code pdf compiler free download debug complete C programs.
At another level, it is more general: to learn the necessary skills to design large and complex software systems. JT Kalnay, contains C programs used to teach C programming.
The programs are presented in an order that presents the simplest, most straightforward aspect of a new element first. Subsequent programs present the more subtle or confusing aspects of a new element. Each chapter of this book can be downloaded in pdf format. This document explains how to construct a compiler using lex and yacc.
Lex and yacc are tools used to generate lexical analyzers and parsers. I assume you can program in C and understand data structures such as linked-lists and trees.