sig
  type position = {
    start_p : CST.lexing_position;
    end_p : CST.lexing_position;
  }
  and lexing_position =
    Stdlib.Lexing.position = {
    pos_fname : string;
    pos_lnum : int;
    pos_bol : int;
    pos_cnum : int;
  }
  and 'a located = { value : 'a; position : CST.position; }
  type program =
      Program_LineBreak_CompleteCommands_LineBreak of CST.linebreak' *
        CST.complete_commands' * CST.linebreak'
    | Program_LineBreak of CST.linebreak'
  and complete_commands =
      CompleteCommands_CompleteCommands_NewlineList_CompleteCommand of
        CST.complete_commands' * CST.newline_list' * CST.complete_command'
    | CompleteCommands_CompleteCommand of CST.complete_command'
  and complete_command =
      CompleteCommand_CList_SeparatorOp of CST.clist' * CST.separator_op'
    | CompleteCommand_CList of CST.clist'
  and clist =
      CList_CList_SeparatorOp_AndOr of CST.clist' * CST.separator_op' *
        CST.and_or'
    | CList_AndOr of CST.and_or'
  and and_or =
      AndOr_Pipeline of CST.pipeline'
    | AndOr_AndOr_AndIf_LineBreak_Pipeline of CST.and_or' * CST.linebreak' *
        CST.pipeline'
    | AndOr_AndOr_OrIf_LineBreak_Pipeline of CST.and_or' * CST.linebreak' *
        CST.pipeline'
  and pipeline =
      Pipeline_PipeSequence of CST.pipe_sequence'
    | Pipeline_Bang_PipeSequence of CST.pipe_sequence'
  and pipe_sequence =
      PipeSequence_Command of CST.command'
    | PipeSequence_PipeSequence_Pipe_LineBreak_Command of
        CST.pipe_sequence' * CST.linebreak' * CST.command'
  and command =
      Command_SimpleCommand of CST.simple_command'
    | Command_CompoundCommand of CST.compound_command'
    | Command_CompoundCommand_RedirectList of CST.compound_command' *
        CST.redirect_list'
    | Command_FunctionDefinition of CST.function_definition'
  and compound_command =
      CompoundCommand_BraceGroup of CST.brace_group'
    | CompoundCommand_Subshell of CST.subshell'
    | CompoundCommand_ForClause of CST.for_clause'
    | CompoundCommand_CaseClause of CST.case_clause'
    | CompoundCommand_IfClause of CST.if_clause'
    | CompoundCommand_WhileClause of CST.while_clause'
    | CompoundCommand_UntilClause of CST.until_clause'
  and subshell = Subshell_Lparen_CompoundList_Rparen of CST.compound_list'
  and compound_list =
      CompoundList_LineBreak_Term of CST.linebreak' * CST.term'
    | CompoundList_LineBreak_Term_Separator of CST.linebreak' * CST.term' *
        CST.separator'
  and term =
      Term_Term_Separator_AndOr of CST.term' * CST.separator' * CST.and_or'
    | Term_AndOr of CST.and_or'
  and for_clause =
      ForClause_For_Name_DoGroup of CST.name' * CST.do_group'
    | ForClause_For_Name_SequentialSep_DoGroup of CST.name' *
        CST.sequential_sep' * CST.do_group'
    | ForClause_For_Name_LineBreak_In_SequentialSep_DoGroup of CST.name' *
        CST.linebreak' * CST.sequential_sep' * CST.do_group'
    | ForClause_For_Name_LineBreak_In_WordList_SequentialSep_DoGroup of
        CST.name' * CST.linebreak' * CST.wordlist' * CST.sequential_sep' *
        CST.do_group'
  and wordlist =
      WordList_WordList_Word of CST.wordlist' * CST.word'
    | WordList_Word of CST.word'
  and case_clause =
      CaseClause_Case_Word_LineBreak_In_LineBreak_CaseList_Esac of
        CST.word' * CST.linebreak' * CST.linebreak' * CST.case_list'
    | CaseClause_Case_Word_LineBreak_In_LineBreak_CaseListNS_Esac of
        CST.word' * CST.linebreak' * CST.linebreak' * CST.case_list_ns'
    | CaseClause_Case_Word_LineBreak_In_LineBreak_Esac of CST.word' *
        CST.linebreak' * CST.linebreak'
  and case_list_ns =
      CaseListNS_CaseList_CaseItemNS of CST.case_list' * CST.case_item_ns'
    | CaseListNS_CaseItemNS of CST.case_item_ns'
  and case_list =
      CaseList_CaseList_CaseItem of CST.case_list' * CST.case_item'
    | CaseList_CaseItem of CST.case_item'
  and case_item_ns =
      CaseItemNS_Pattern_Rparen_LineBreak of CST.pattern' * CST.linebreak'
    | CaseItemNS_Pattern_Rparen_CompoundList of CST.pattern' *
        CST.compound_list'
    | CaseItemNS_Lparen_Pattern_Rparen_LineBreak of CST.pattern' *
        CST.linebreak'
    | CaseItemNS_Lparen_Pattern_Rparen_CompoundList of CST.pattern' *
        CST.compound_list'
  and case_item =
      CaseItem_Pattern_Rparen_LineBreak_Dsemi_LineBreak of CST.pattern' *
        CST.linebreak' * CST.linebreak'
    | CaseItem_Pattern_Rparen_CompoundList_Dsemi_LineBreak of CST.pattern' *
        CST.compound_list' * CST.linebreak'
    | CaseItem_Lparen_Pattern_Rparen_LineBreak_Dsemi_LineBreak of
        CST.pattern' * CST.linebreak' * CST.linebreak'
    | CaseItem_Lparen_Pattern_Rparen_CompoundList_Dsemi_LineBreak of
        CST.pattern' * CST.compound_list' * CST.linebreak'
  and pattern =
      Pattern_Word of CST.word'
    | Pattern_Pattern_Pipe_Word of CST.pattern' * CST.word'
  and if_clause =
      IfClause_If_CompoundList_Then_CompoundList_ElsePart_Fi of
        CST.compound_list' * CST.compound_list' * CST.else_part'
    | IfClause_If_CompoundList_Then_CompoundList_Fi of CST.compound_list' *
        CST.compound_list'
  and else_part =
      ElsePart_Elif_CompoundList_Then_CompoundList of CST.compound_list' *
        CST.compound_list'
    | ElsePart_Elif_CompoundList_Then_CompoundList_ElsePart of
        CST.compound_list' * CST.compound_list' * CST.else_part'
    | ElsePart_Else_CompoundList of CST.compound_list'
  and while_clause =
      WhileClause_While_CompoundList_DoGroup of CST.compound_list' *
        CST.do_group'
  and until_clause =
      UntilClause_Until_CompoundList_DoGroup of CST.compound_list' *
        CST.do_group'
  and function_definition =
      FunctionDefinition_Fname_Lparen_Rparen_LineBreak_FunctionBody of
        CST.fname' * CST.linebreak' * CST.function_body'
  and function_body =
      FunctionBody_CompoundCommand of CST.compound_command'
    | FunctionBody_CompoundCommand_RedirectList of CST.compound_command' *
        CST.redirect_list'
  and fname = Fname_Name of CST.name
  and brace_group =
      BraceGroup_LBrace_CompoundList_RBrace of CST.compound_list'
  and do_group = DoGroup_Do_CompoundList_Done of CST.compound_list'
  and simple_command =
      SimpleCommand_CmdPrefix_CmdWord_CmdSuffix of CST.cmd_prefix' *
        CST.cmd_word' * CST.cmd_suffix'
    | SimpleCommand_CmdPrefix_CmdWord of CST.cmd_prefix' * CST.cmd_word'
    | SimpleCommand_CmdPrefix of CST.cmd_prefix'
    | SimpleCommand_CmdName_CmdSuffix of CST.cmd_name' * CST.cmd_suffix'
    | SimpleCommand_CmdName of CST.cmd_name'
  and cmd_name = CmdName_Word of CST.word'
  and cmd_word = CmdWord_Word of CST.word'
  and cmd_prefix =
      CmdPrefix_IoRedirect of CST.io_redirect'
    | CmdPrefix_CmdPrefix_IoRedirect of CST.cmd_prefix' * CST.io_redirect'
    | CmdPrefix_AssignmentWord of CST.assignment_word'
    | CmdPrefix_CmdPrefix_AssignmentWord of CST.cmd_prefix' *
        CST.assignment_word'
  and cmd_suffix =
      CmdSuffix_IoRedirect of CST.io_redirect'
    | CmdSuffix_CmdSuffix_IoRedirect of CST.cmd_suffix' * CST.io_redirect'
    | CmdSuffix_Word of CST.word'
    | CmdSuffix_CmdSuffix_Word of CST.cmd_suffix' * CST.word'
  and redirect_list =
      RedirectList_IoRedirect of CST.io_redirect'
    | RedirectList_RedirectList_IoRedirect of CST.redirect_list' *
        CST.io_redirect'
  and io_redirect =
      IoRedirect_IoFile of CST.io_file'
    | IoRedirect_IoNumber_IoFile of CST.io_number * CST.io_file'
    | IoRedirect_IoHere of CST.io_here'
    | IoRedirect_IoNumber_IoHere of CST.io_number * CST.io_here'
  and io_file =
      IoFile_Less_FileName of CST.filename'
    | IoFile_LessAnd_FileName of CST.filename'
    | IoFile_Great_FileName of CST.filename'
    | IoFile_GreatAnd_FileName of CST.filename'
    | IoFile_DGreat_FileName of CST.filename'
    | IoFile_LessGreat_FileName of CST.filename'
    | IoFile_Clobber_FileName of CST.filename'
  and filename = Filename_Word of CST.word'
  and io_here =
      IoHere_DLess_HereEnd of CST.here_end' * CST.word' Stdlib.ref
    | IoHere_DLessDash_HereEnd of CST.here_end' * CST.word' Stdlib.ref
  and here_end = HereEnd_Word of CST.word'
  and newline_list =
      NewLineList_NewLine
    | NewLineList_NewLineList_NewLine of CST.newline_list'
  and linebreak =
      LineBreak_NewLineList of CST.newline_list'
    | LineBreak_Empty
  and separator_op = SeparatorOp_Uppersand | SeparatorOp_Semicolon
  and separator =
      Separator_SeparatorOp_LineBreak of CST.separator_op' * CST.linebreak'
    | Separator_NewLineList of CST.newline_list'
  and sequential_sep =
      SequentialSep_Semicolon_LineBreak of CST.linebreak'
    | SequentialSep_NewLineList of CST.newline_list'
  and word = Word of string * CST.word_cst
  and word_cst = CST.word_component list
  and word_component =
      WordSubshell of CST.subshell_kind * CST.program CST.located
    | WordName of string
    | WordAssignmentWord of CST.assignment_word
    | WordDoubleQuoted of CST.word
    | WordSingleQuoted of CST.word
    | WordTildePrefix of string
    | WordLiteral of string
    | WordVariable of CST.variable
    | WordGlobAll
    | WordGlobAny
    | WordReBracketExpression of CST.bracket_expression
    | WordEmpty
  and bracket_expression =
      BracketExpression_LBRACKET_MatchingList_RBRACKET of CST.matching_list
    | BracketExpression_LBRACKET_NonMatchingList_RBRACKET of
        CST.nonmatching_list
  and matching_list = MatchingList_BracketList of CST.bracket_list
  and nonmatching_list = NonMatchingList_BracketList of CST.bracket_list
  and bracket_list =
      BracketList_FollowList of CST.follow_list
    | BracketList_FollowList_MINUS of CST.follow_list
  and follow_list =
      FollowList_ExpressionTerm of CST.expression_term
    | FollowList_FollowList_ExpressionTerm of CST.follow_list *
        CST.expression_term
  and expression_term =
      ExpressionTerm_SingleExpression of CST.single_expression
    | ExpressionTerm_RangeExpression of CST.range_expression
  and single_expression =
      SingleExpression_EndRange of CST.end_range
    | SingleExpression_CharacterClass of CST.character_class
    | SingleExpression_EquivalenceClass of CST.equivalence_class
  and range_expression =
      RangeExpression_StartRange_EndRange of CST.start_range * CST.end_range
    | RangeExpression_StartRange_MINUS of CST.start_range
  and start_range = StartRange_EndRange_MINUS of CST.end_range
  and end_range =
      EndRange_COLLELEMSINGLE of char
    | EndRangeCollatingSymbol of CST.collating_symbol
  and collating_symbol =
      CollatingSymbol_OpenDot_COLLELEMSINGLE_DotClose of char
    | CollatingSymbol_OpenDot_COLLELEMMULTI_DotClose of string
    | CollatingSymbol_OpenDot_METACHAR_DotClose of char
  and equivalence_class =
      EquivalenceClass_OpenEqual_COLLELEMSINGLE_EqualClose of char
    | EquivalenceClass_OpenEqual_COLLELEMMULTI_EqualClose of string
  and character_class =
      CharacterClass_OpenColon_CLASSNAME_ColonClose of CST.class_name
  and class_name = ClassName of string
  and character_range = Range of char list
  and variable = VariableAtom of string * CST.variable_attribute
  and variable_attribute =
      NoAttribute
    | ParameterLength
    | UseDefaultValues of string * CST.word
    | AssignDefaultValues of string * CST.word
    | IndicateErrorifNullorUnset of string * CST.word
    | UseAlternativeValue of string * CST.word
    | RemoveSmallestSuffixPattern of CST.word
    | RemoveLargestSuffixPattern of CST.word
    | RemoveSmallestPrefixPattern of CST.word
    | RemoveLargestPrefixPattern of CST.word
  and subshell_kind = SubShellKindBackQuote | SubShellKindParentheses
  and name = Name of string
  and assignment_word = CST.name * CST.word
  and io_number = IONumber of string
  and program' = CST.program CST.located
  and complete_commands' = CST.complete_commands CST.located
  and complete_command' = CST.complete_command CST.located
  and clist' = CST.clist CST.located
  and and_or' = CST.and_or CST.located
  and pipeline' = CST.pipeline CST.located
  and pipe_sequence' = CST.pipe_sequence CST.located
  and command' = CST.command CST.located
  and compound_command' = CST.compound_command CST.located
  and subshell' = CST.subshell CST.located
  and compound_list' = CST.compound_list CST.located
  and term' = CST.term CST.located
  and for_clause' = CST.for_clause CST.located
  and wordlist' = CST.wordlist CST.located
  and case_clause' = CST.case_clause CST.located
  and case_list_ns' = CST.case_list_ns CST.located
  and case_list' = CST.case_list CST.located
  and case_item_ns' = CST.case_item_ns CST.located
  and case_item' = CST.case_item CST.located
  and pattern' = CST.pattern CST.located
  and if_clause' = CST.if_clause CST.located
  and else_part' = CST.else_part CST.located
  and while_clause' = CST.while_clause CST.located
  and until_clause' = CST.until_clause CST.located
  and function_definition' = CST.function_definition CST.located
  and function_body' = CST.function_body CST.located
  and fname' = CST.fname CST.located
  and brace_group' = CST.brace_group CST.located
  and do_group' = CST.do_group CST.located
  and simple_command' = CST.simple_command CST.located
  and cmd_name' = CST.cmd_name CST.located
  and cmd_word' = CST.cmd_word CST.located
  and cmd_prefix' = CST.cmd_prefix CST.located
  and cmd_suffix' = CST.cmd_suffix CST.located
  and redirect_list' = CST.redirect_list CST.located
  and io_redirect' = CST.io_redirect CST.located
  and io_file' = CST.io_file CST.located
  and filename' = CST.filename CST.located
  and io_here' = CST.io_here CST.located
  and here_end' = CST.here_end CST.located
  and newline_list' = CST.newline_list CST.located
  and linebreak' = CST.linebreak CST.located
  and separator_op' = CST.separator_op CST.located
  and separator' = CST.separator CST.located
  and sequential_sep' = CST.sequential_sep CST.located
  and word' = CST.word CST.located
  and name' = CST.name CST.located
  and assignment_word' = CST.assignment_word CST.located
end