Module Morsmall.AST

Shell AST.

type name = string
and character_range = char list
and attribute =
| NoAttribute
| ParameterLength of word
| UseDefaultValues of word
| AssignDefaultValues of word
| IndicateErrorifNullorUnset of word
| UseAlternativeValue of word
| RemoveSmallestSuffixPattern of word
| RemoveLargestSuffixPattern of word
| RemoveSmallestPrefixPattern of word
| RemoveLargestPrefixPattern of word
and word_component =
| WTildePrefix of string
| WLiteral of string
| WDoubleQuoted of word
| WVariable of name * attribute
| WSubshell of program
| WGlobAll
| WGlobAny
| WBracketExpression of Morbig.CST.bracket_expression
and word = word_component list
and word' = word Location.located
and pattern = word list
and pattern' = pattern Location.located
and assignment = name * word
and assignment' = assignment Location.located
and descr = int

Simple Command

See POSIX, 2 Shell & Utilities, 2.9.1 Simple Command

Lists and Pipelines

See POSIX, 2 Shell & Utilities, 2.9.2 Pipelines and 2.9.3 Lists

  • Asynchronous Lists. When encountering Async c, the Shell shall execute c asynchronously in a subshell. This means that the shell shall not wait for the command to finish before executing the next command.
  • Sequential Lists. A contrario, the commands c1 and c2 in Seq (c1, c2) shall be executed sequentially.
  • AND Lists. In And (c1, c2), c1 shall be executed first. If its exit status is zero, c2 shall be executed. The commands are expanded only if they are executed.
  • OR Lists. In Or (c1, c2), c1 shall be executed first. If its exit status is non-zero, c2 shall be executed.
  • Pipeline. In Pipe (c1, c2), the standard output of c1 shall be connected to the standard input of c2. The standard input, standard output, or both of a command shall be considered to be assigned by the pipeline before any redirection specified by redirection operators that are part of the command.
  • Negation. The command Not c has the same behaviour as c, except for the exit status that shall be the logical NOT of the exit status of c.

Compound Commands

See POSIX, 2 Shell & Utilities, 2.9.4 Compound Commands

  • The Subshell Environment. Subshell c shall execute c a subshell environment. Variable assignments and built-in commands that affect the environment shall not remain in effect after the list finishes.
  • The for Loop. For (x, l, c) shall execute a sequence of commands c for each member in a list of items. It is to be noted that l is non-mandatory and is thus an option. Besides, there is an important semantic difference between None and Some []. The former appears in a for loop where the list of words appear but is empty. In that case, the for loops through the empty list. The latter appears in a for loop where the list of words has been omitted. In that case, the for loops through the positional parameters.
  • The case Conditional Construct. Case (w, [([p11;...],c1); ...]) shall execute the compound-list corresponding to the first one of several patterns that is matched by the string resulting from the expansion of the given word w. In order from the beginning to the end of the case statement, each pattern p* shall be subjected to expansion, and the result of these expansions shall be compared against the expansion of w. After the first match, no more patterns shall be expanded, and the corresponding c* shall be executed. The order of expansion and comparison of multiple patterns that label the same statement is unspecified.
  • The if Conditional Construct. If (c1, c2, c3) shall execute c1 and use its exit status to determine whether to execute c2 or c3. In fact, c3 is not mandatory and is thus an option.
  • The while Loop. While (c1, c2) shall continuously execute c2 as long as c1 has a zero exit status.
  • The until Loop. Until (c1, c2) shall continuously execute c2 as long as c1 has a non-zero exit status.

Function Definition Command

See POSIX, 2 Shell & Utilities, 2.9.5 Function Definition Command

A function is a user-defined name that is used as a simple command to call a compound command with new positional parameters. A function is defined with a function definition command, Function (name, body).

This function definition command defines a function named name: string and with body body: command. The body shall be executed whenever name is specified as the name of a simple command.

Redirection

See POSIX, 2 Shell & Utilities, 2.7 Redirections

Type Definitions

The type command describes a command in the AST. All the command semantics are described at the top of this document.

and program = command' list
and command =
| Simple of assignment' list * word' list
| Async of command
| Seq of command' * command'
| And of command' * command'
| Or of command' * command'
| Not of command'
| Pipe of command' * command'
| Subshell of command'
| For of name * word list option * command'
| Case of word * case_item' list
| If of command' * command' * command' option
| While of command' * command'
| Until of command' * command'
| Function of name * command'
| Redirection of command' * descr * kind * word
| HereDocument of command' * descr * word'
and command' = command Location.located
and case_item = pattern' * command' option
and case_item' = case_item Location.located
and kind =
| Output
| OutputDuplicate
| OutputAppend
| OutputClobber
| Input
| InputDuplicate
| InputOutput
val equal_name : name -> name -> Ppx_deriving_runtime.bool
val equal_character_range : character_range -> character_range -> Ppx_deriving_runtime.bool
val equal_attribute : attribute -> attribute -> Ppx_deriving_runtime.bool
val equal_word_component : word_component -> word_component -> Ppx_deriving_runtime.bool
val equal_word : word -> word -> Ppx_deriving_runtime.bool
val equal_word' : word' -> word' -> Ppx_deriving_runtime.bool
val equal_pattern : pattern -> pattern -> Ppx_deriving_runtime.bool
val equal_pattern' : pattern' -> pattern' -> Ppx_deriving_runtime.bool
val equal_assignment : assignment -> assignment -> Ppx_deriving_runtime.bool
val equal_assignment' : assignment' -> assignment' -> Ppx_deriving_runtime.bool
val equal_descr : descr -> descr -> Ppx_deriving_runtime.bool
val equal_program : program -> program -> Ppx_deriving_runtime.bool
val equal_command : command -> command -> Ppx_deriving_runtime.bool
val equal_command' : command' -> command' -> Ppx_deriving_runtime.bool
val equal_case_item : case_item -> case_item -> Ppx_deriving_runtime.bool
val equal_case_item' : case_item' -> case_item' -> Ppx_deriving_runtime.bool
val equal_kind : kind -> kind -> Ppx_deriving_runtime.bool
val pp_name : Ppx_deriving_runtime.Format.formatter -> name -> Ppx_deriving_runtime.unit
val show_name : name -> Ppx_deriving_runtime.string
val pp_character_range : Ppx_deriving_runtime.Format.formatter -> character_range -> Ppx_deriving_runtime.unit
val show_character_range : character_range -> Ppx_deriving_runtime.string
val pp_attribute : Ppx_deriving_runtime.Format.formatter -> attribute -> Ppx_deriving_runtime.unit
val show_attribute : attribute -> Ppx_deriving_runtime.string
val pp_word_component : Ppx_deriving_runtime.Format.formatter -> word_component -> Ppx_deriving_runtime.unit
val show_word_component : word_component -> Ppx_deriving_runtime.string
val pp_word : Ppx_deriving_runtime.Format.formatter -> word -> Ppx_deriving_runtime.unit
val show_word : word -> Ppx_deriving_runtime.string
val pp_word' : Ppx_deriving_runtime.Format.formatter -> word' -> Ppx_deriving_runtime.unit
val show_word' : word' -> Ppx_deriving_runtime.string
val pp_pattern : Ppx_deriving_runtime.Format.formatter -> pattern -> Ppx_deriving_runtime.unit
val show_pattern : pattern -> Ppx_deriving_runtime.string
val pp_pattern' : Ppx_deriving_runtime.Format.formatter -> pattern' -> Ppx_deriving_runtime.unit
val show_pattern' : pattern' -> Ppx_deriving_runtime.string
val pp_assignment : Ppx_deriving_runtime.Format.formatter -> assignment -> Ppx_deriving_runtime.unit
val show_assignment : assignment -> Ppx_deriving_runtime.string
val pp_assignment' : Ppx_deriving_runtime.Format.formatter -> assignment' -> Ppx_deriving_runtime.unit
val show_assignment' : assignment' -> Ppx_deriving_runtime.string
val pp_descr : Ppx_deriving_runtime.Format.formatter -> descr -> Ppx_deriving_runtime.unit
val show_descr : descr -> Ppx_deriving_runtime.string
val pp_program : Ppx_deriving_runtime.Format.formatter -> program -> Ppx_deriving_runtime.unit
val show_program : program -> Ppx_deriving_runtime.string
val pp_command : Ppx_deriving_runtime.Format.formatter -> command -> Ppx_deriving_runtime.unit
val show_command : command -> Ppx_deriving_runtime.string
val pp_command' : Ppx_deriving_runtime.Format.formatter -> command' -> Ppx_deriving_runtime.unit
val show_command' : command' -> Ppx_deriving_runtime.string
val pp_case_item : Ppx_deriving_runtime.Format.formatter -> case_item -> Ppx_deriving_runtime.unit
val show_case_item : case_item -> Ppx_deriving_runtime.string
val pp_case_item' : Ppx_deriving_runtime.Format.formatter -> case_item' -> Ppx_deriving_runtime.unit
val show_case_item' : case_item' -> Ppx_deriving_runtime.string
val pp_kind : Ppx_deriving_runtime.Format.formatter -> kind -> Ppx_deriving_runtime.unit
val show_kind : kind -> Ppx_deriving_runtime.string
val name_to_yojson : name -> Yojson.Safe.t
val name_of_yojson : Yojson.Safe.t -> name Ppx_deriving_yojson_runtime.error_or
val character_range_to_yojson : character_range -> Yojson.Safe.t
val character_range_of_yojson : Yojson.Safe.t -> character_range Ppx_deriving_yojson_runtime.error_or
val attribute_to_yojson : attribute -> Yojson.Safe.t
val attribute_of_yojson : Yojson.Safe.t -> attribute Ppx_deriving_yojson_runtime.error_or
val word_component_to_yojson : word_component -> Yojson.Safe.t
val word_component_of_yojson : Yojson.Safe.t -> word_component Ppx_deriving_yojson_runtime.error_or
val word_to_yojson : word -> Yojson.Safe.t
val word_of_yojson : Yojson.Safe.t -> word Ppx_deriving_yojson_runtime.error_or
val word'_to_yojson : word' -> Yojson.Safe.t
val word'_of_yojson : Yojson.Safe.t -> word' Ppx_deriving_yojson_runtime.error_or
val pattern_to_yojson : pattern -> Yojson.Safe.t
val pattern_of_yojson : Yojson.Safe.t -> pattern Ppx_deriving_yojson_runtime.error_or
val pattern'_to_yojson : pattern' -> Yojson.Safe.t
val pattern'_of_yojson : Yojson.Safe.t -> pattern' Ppx_deriving_yojson_runtime.error_or
val assignment_to_yojson : assignment -> Yojson.Safe.t
val assignment_of_yojson : Yojson.Safe.t -> assignment Ppx_deriving_yojson_runtime.error_or
val assignment'_to_yojson : assignment' -> Yojson.Safe.t
val assignment'_of_yojson : Yojson.Safe.t -> assignment' Ppx_deriving_yojson_runtime.error_or
val descr_to_yojson : descr -> Yojson.Safe.t
val descr_of_yojson : Yojson.Safe.t -> descr Ppx_deriving_yojson_runtime.error_or
val program_to_yojson : program -> Yojson.Safe.t
val program_of_yojson : Yojson.Safe.t -> program Ppx_deriving_yojson_runtime.error_or
val command_to_yojson : command -> Yojson.Safe.t
val command_of_yojson : Yojson.Safe.t -> command Ppx_deriving_yojson_runtime.error_or
val command'_to_yojson : command' -> Yojson.Safe.t
val command'_of_yojson : Yojson.Safe.t -> command' Ppx_deriving_yojson_runtime.error_or
val case_item_to_yojson : case_item -> Yojson.Safe.t
val case_item_of_yojson : Yojson.Safe.t -> case_item Ppx_deriving_yojson_runtime.error_or
val case_item'_to_yojson : case_item' -> Yojson.Safe.t
val case_item'_of_yojson : Yojson.Safe.t -> case_item' Ppx_deriving_yojson_runtime.error_or
val kind_to_yojson : kind -> Yojson.Safe.t
val kind_of_yojson : Yojson.Safe.t -> kind Ppx_deriving_yojson_runtime.error_or
val _ : name -> Yojson.Safe.t
val _ : Yojson.Safe.t -> name Ppx_deriving_yojson_runtime.error_or
val name_of_yojson_exn : Yojson.Safe.t -> name
val _ : Yojson.Safe.t -> name
val _ : character_range -> Yojson.Safe.t
val _ : Yojson.Safe.t -> character_range Ppx_deriving_yojson_runtime.error_or
val character_range_of_yojson_exn : Yojson.Safe.t -> character_range
val _ : Yojson.Safe.t -> character_range
val _ : attribute -> Yojson.Safe.t
val _ : Yojson.Safe.t -> attribute Ppx_deriving_yojson_runtime.error_or
val attribute_of_yojson_exn : Yojson.Safe.t -> attribute
val _ : Yojson.Safe.t -> attribute
val _ : word_component -> Yojson.Safe.t
val _ : Yojson.Safe.t -> word_component Ppx_deriving_yojson_runtime.error_or
val word_component_of_yojson_exn : Yojson.Safe.t -> word_component
val _ : Yojson.Safe.t -> word_component
val _ : word -> Yojson.Safe.t
val _ : Yojson.Safe.t -> word Ppx_deriving_yojson_runtime.error_or
val word_of_yojson_exn : Yojson.Safe.t -> word
val _ : Yojson.Safe.t -> word
val _ : word' -> Yojson.Safe.t
val _ : Yojson.Safe.t -> word' Ppx_deriving_yojson_runtime.error_or
val word'_of_yojson_exn : Yojson.Safe.t -> word'
val _ : Yojson.Safe.t -> word'
val _ : pattern -> Yojson.Safe.t
val _ : Yojson.Safe.t -> pattern Ppx_deriving_yojson_runtime.error_or
val pattern_of_yojson_exn : Yojson.Safe.t -> pattern
val _ : Yojson.Safe.t -> pattern
val _ : pattern' -> Yojson.Safe.t
val _ : Yojson.Safe.t -> pattern' Ppx_deriving_yojson_runtime.error_or
val pattern'_of_yojson_exn : Yojson.Safe.t -> pattern'
val _ : Yojson.Safe.t -> pattern'
val _ : assignment -> Yojson.Safe.t
val _ : Yojson.Safe.t -> assignment Ppx_deriving_yojson_runtime.error_or
val assignment_of_yojson_exn : Yojson.Safe.t -> assignment
val _ : Yojson.Safe.t -> assignment
val _ : assignment' -> Yojson.Safe.t
val _ : Yojson.Safe.t -> assignment' Ppx_deriving_yojson_runtime.error_or
val assignment'_of_yojson_exn : Yojson.Safe.t -> assignment'
val _ : Yojson.Safe.t -> assignment'
val _ : descr -> Yojson.Safe.t
val _ : Yojson.Safe.t -> descr Ppx_deriving_yojson_runtime.error_or
val descr_of_yojson_exn : Yojson.Safe.t -> descr
val _ : Yojson.Safe.t -> descr
val _ : program -> Yojson.Safe.t
val _ : Yojson.Safe.t -> program Ppx_deriving_yojson_runtime.error_or
val program_of_yojson_exn : Yojson.Safe.t -> program
val _ : Yojson.Safe.t -> program
val _ : command -> Yojson.Safe.t
val _ : Yojson.Safe.t -> command Ppx_deriving_yojson_runtime.error_or
val command_of_yojson_exn : Yojson.Safe.t -> command
val _ : Yojson.Safe.t -> command
val _ : command' -> Yojson.Safe.t
val _ : Yojson.Safe.t -> command' Ppx_deriving_yojson_runtime.error_or
val command'_of_yojson_exn : Yojson.Safe.t -> command'
val _ : Yojson.Safe.t -> command'
val _ : case_item -> Yojson.Safe.t
val _ : Yojson.Safe.t -> case_item Ppx_deriving_yojson_runtime.error_or
val case_item_of_yojson_exn : Yojson.Safe.t -> case_item
val _ : Yojson.Safe.t -> case_item
val _ : case_item' -> Yojson.Safe.t
val _ : Yojson.Safe.t -> case_item' Ppx_deriving_yojson_runtime.error_or
val case_item'_of_yojson_exn : Yojson.Safe.t -> case_item'
val _ : Yojson.Safe.t -> case_item'
val _ : kind -> Yojson.Safe.t
val _ : Yojson.Safe.t -> kind Ppx_deriving_yojson_runtime.error_or
val kind_of_yojson_exn : Yojson.Safe.t -> kind
val _ : Yojson.Safe.t -> kind
include sig ... end
class virtual +'b iter : object ... end
include sig ... end
class virtual +'c map : object ... end
include sig ... end
class virtual +'b reduce : object ... end
include sig ... end
class virtual +'c mapreduce : object ... end
include sig ... end
class virtual +'c iter2 : object ... end
include sig ... end
class virtual +'d map2 : object ... end
include sig ... end
class virtual +'c reduce2 : object ... end
val default_redirection_descriptor : kind -> int