adriaan van wijngaarden alain colmerauer computer program context-free grammar context-sensitive grammar dick grune ergonomics hyper meta natural language programming language prolog steven pemberton two-level grammar unification