let pragma = function
  | GPragma(Attr(name,[AStr arg]),_)
  | GPragma(Attr(name,[ACons(arg,[])]),_) ->
      begin match name with
        | "InvariantPolicy" ->
            begin match String.lowercase arg with
              | "none" -> [Jc_output.JCinvariant_policy Jc_env.InvNone]
              | "arguments" ->
                  [Jc_output.JCinvariant_policy Jc_env.InvArguments]
              | "ownership" ->
                  [Jc_output.JCinvariant_policy Jc_env.InvOwnership]
              | _ -> assert false
            end
        | "SeparationPolicy" ->
            begin match String.lowercase arg with
              | "none" -> [Jc_output.JCseparation_policy Jc_env.SepNone]
              | "regions" -> [Jc_output.JCseparation_policy Jc_env.SepRegions]
              | _ -> assert false
            end
        | "AnnotationPolicy" ->
            begin match String.lowercase arg with
              | "none" -> [Jc_output.JCannotation_policy Jc_env.AnnotNone]
              | "invariants" ->
                  [Jc_output.JCannotation_policy Jc_env.AnnotInvariants]
              | "weakpre" ->
                  [Jc_output.JCannotation_policy Jc_env.AnnotWeakPre]
              | "strongpre" ->
                  [Jc_output.JCannotation_policy Jc_env.AnnotStrongPre]
              | _ -> assert false
            end
        | "AbstractDomain" ->
            begin match String.lowercase arg with
              | "none" -> [Jc_output.JCabstract_domain Jc_env.AbsNone]
              | "box" -> [Jc_output.JCabstract_domain Jc_env.AbsBox]
              | "oct" -> [Jc_output.JCabstract_domain Jc_env.AbsOct]
              | "pol" -> [Jc_output.JCabstract_domain Jc_env.AbsPol]
              | _ -> assert false
            end
        | "JessieFloatModel" ->
            begin match String.lowercase arg with
              | "real" -> float_model := `Real;
                  [Jc_output.JCfloat_model Jc_env.FMreal]
              | "strict" -> float_model := `Strict;
                  [Jc_output.JCfloat_model Jc_env.FMstrict]
              | "full" -> float_model := `Full;
                  [Jc_output.JCfloat_model Jc_env.FMfull]
              | "multirounding" -> float_model := `Multirounding;
                  [Jc_output.JCfloat_model Jc_env.FMmultirounding]
              | s ->
                  Jessie_options.warning ~current:true
                    "pragma %s: identifier %s is not a valid value (ignored)." 
                    name s; []
            end;
        | "JessieFloatRoundingMode" ->
            begin match String.lowercase arg with
              | "nearest" ->
                  float_rounding_mode := `Nearest;
                  [Jc_output.JCfloat_rounding_mode Jc_env.FRMnearest]
              | "downward" -> float_rounding_mode := `Downward;
                  [Jc_output.JCfloat_rounding_mode Jc_env.FRMdownward]
              | "upward" -> float_rounding_mode := `Upward;
                  [Jc_output.JCfloat_rounding_mode Jc_env.FRMupward]
              | "towardzero" -> float_rounding_mode := `Towardzero;
                  [Jc_output.JCfloat_rounding_mode Jc_env.FRMtowardzero]
              | "towardawayzero" -> float_rounding_mode := `Towardawayzero;
                  [Jc_output.JCfloat_rounding_mode Jc_env.FRMtowardawayzero]
              | s ->
                  Jessie_options.warning ~current:true 
                    "pragma %s: identifier %s is not a valid value (ignored)" name s; []
            end
        | "JessieFloatInstructionSet" ->
            begin match String.lowercase arg with
              | "x87" ->
                  [Jc_output.JCfloat_instruction_set "x87"]
              | "ieee754" ->
                  [Jc_output.JCfloat_instruction_set "ieee754"]
              | s ->
                  Jessie_options.warning ~current:true
                    "pragma %s: identifier %s is not a valid value (ignored)" name s; []
            end

        | "JessieIntegerModel" ->
            begin match String.lowercase arg with
              | "exact" | "math" ->
                  Jessie_options.IntModel.set "exact"
              | "strict" ->
                  Jessie_options.IntModel.set "strict"
              | "modulo" ->
                  Jessie_options.IntModel.set "modulo"
              | s ->
                  Jessie_options.warning ~current:true
                    "pragma %s: identifier %s is not a valid value (ignored)." name s
            end;
            []
        | _ ->
            Jessie_options.warning ~current:true
              "pragma %s is ignored by Jessie." name;
            []
      end
  | GPragma _ -> []
  | _ -> []