An efficient context-free parsing algorithm with semantic actions