A parser is a program that recognizes (parses) a language. In compiling (or interpreting) a program, a parser typically accepts as input a stream of tokens generated by a lexical analyzer. The parser then transforms this stream into a representation of the program it recognized. The output is usually some intermediate format, such as some other high level language, or perhaps an abstract syntax tree, though in some cases actual machine code is generated.
program text tokens
-------------> lexer -------> parser ---> output
The lexer and parser combination of a compiler is often called its front-end. Parsers can be built by hand, or they can be built using one of several available parser-generators, such as yacc/bison, or ANTLR. Typically in using these tools, the language to be recognized is written in some extended form of BNF, along with embedded "actions" that tells the parser what to do when a BNF rule is recognized.
yacc is an LALR(1) parser generator, while ANTLR is an LL(k) parser generator. This means that these tools, in the interest of efficiency, can be specified only to accept a subset of context free grammars.