Coco/R takes a compiler description in the form of an attributed grammar (EBNF syntax with attributes and semantic actions) and translates it into a scanner and a recursive descent parser. The user has to add modules for symbol table handling, optimization, and code generation in order to get a running compiler. LL(1) conflicts can be resolved by a special lookahead mechanism. Coco/R has been used successfully in academia and industry. It combines the functionality of the well-known Unix tools Lex and Yacc.
Coco/R is available under GNU GPL from http://ssw.jku.at/coco/
Here is an example of a small compiler description with Coco/R:
COMPILER Demo
CHARACTERS
letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrtsuvwxyz".
digit = "0123456789".
EOL = '\t'.
TOKENS
ident = letter {letter | digit}.
number = digit {digit}.
COMMENTS FROM "/*" TO "*/" NESTED
IGNORE EOL
PRODUCTIONS
Demo = Statement {";" Statement}.
//------------------------------------------------------------------------------------
Statement (. string x; int y; .)
= Ident<out x> "=" Number<out y> (. CodeGen.Assign(x, y); .)
.
//------------------------------------------------------------------------------------
Ident <out string x>
= ident (. x = t.val; .)
.
//------------------------------------------------------------------------------------
Number <out int n>
= number (. n = Convert.ToInt32(t.val); .)
.
END Demo.