Surface.Parser_stateSourceOur parser crosses the bounds of LR parsing for two features:
for these purposes we maintain a little bit of state and contained side-effects.
Mandatory wrapper around parser calls
val new_heading :
(string * string option * bool * int) ->
(Lexing.position * Lexing.position) ->
Ast.law_heading