How do engines read PGN? I'm writing a small chess engine in LISP. I was trying to read some PGN file, at first it seemed like a piece of cake. But then I realized something.

Most of the PGN files, don't tell which is white and which is black. I mean if white plays e4 an later d5, how does the engine knows if he has to take or not? I could name the black pieces bN for example but by doing so i won't be able to import PGN easily.

Should i increment by 2? is that how PGN parsers do it?  Say the first three moves in a match are e4 e6 f4, should i create a recursive function to read x + 2? to skip whites move?
There is a detailed standard of PGN available, for instance here: PGN standard at the Wayback Machine.

You will never see "e4 e6 f4" in a PGN file, since it is mandatory to mention the move number before white's move: "1.e4 e6 2.f4".