<?php
/*
 * Generated by WikiPEG
 */


namespace Shellbox\ShellParser;


	use Wikimedia\WikiPEG\InternalError;
	// @phan-file-suppress PhanUnusedGotoLabel
	// @phan-file-suppress PhanNoopSwitchCases



class PEGParserCacheEntry {
	public $nextPos;
	public $result;


	public function __construct( $nextPos, $result ) {
		$this->nextPos = $nextPos;
		$this->result = $result;

	}
}


class PEGParser extends \Wikimedia\WikiPEG\PEGParserBase {
	// initializer
	
	/**
	 * Overridable tree node constructor
	 *
	 * @stable to override
	 * @param string $type
	 * @param array|Node|string $contents
	 * @return Node
	 */
	protected function node( $type, $contents ) {
		return new Node( $type, $contents );
	}

	/**
	 * Combine arrays and non-array items into a single flat array.
	 *
	 * @param array|Node|string|null ...$items
	 * @return array
	 * @phan-return array<Node|string>
	 */
	private function merge( ...$items ) {
		if ( !$items ) {
			return [];
		}
		$mergeArgs = [];
		foreach ( $items as $item ) {
			if ( $item !== null ) {
				if ( !is_array( $item ) ) {
					$mergeArgs[] = [ $item ];
				} else {
					$mergeArgs[] = $item;
				}
			}
		}
		return array_merge( ...$mergeArgs );
	}


	// cache init
	  protected $cache = [];

	// expectations
	protected $expectations = [
		0 => ["type" => "end", "description" => "end of input"],
1 => ["type" => "literal", "value" => "\x0a", "description" => "\"\\n\""],
2 => ["type" => "class", "value" => "[ \\t\\v\\r\\f]", "description" => "[ \\t\\v\\r\\f]"],
3 => ["type" => "literal", "value" => "#", "description" => "\"#\""],
4 => ["type" => "class", "value" => "[^\\n]", "description" => "[^\\n]"],
5 => ["type" => "literal", "value" => "&&", "description" => "\"&&\""],
6 => ["type" => "literal", "value" => "||", "description" => "\"||\""],
7 => ["type" => "literal", "value" => "&", "description" => "\"&\""],
8 => ["type" => "literal", "value" => ";", "description" => "\";\""],
9 => ["type" => "literal", "value" => "!", "description" => "\"!\""],
10 => ["type" => "literal", "value" => ";;", "description" => "\";;\""],
11 => ["type" => "literal", "value" => "|", "description" => "\"|\""],
12 => ["type" => "class", "value" => "[_a-zA-Z]", "description" => "[_a-zA-Z]"],
13 => ["type" => "class", "value" => "[_a-zA-Z0-9]", "description" => "[_a-zA-Z0-9]"],
14 => ["type" => "literal", "value" => "(", "description" => "\"(\""],
15 => ["type" => "literal", "value" => ")", "description" => "\")\""],
16 => ["type" => "literal", "value" => "=", "description" => "\"=\""],
17 => ["type" => "literal", "value" => "{", "description" => "\"{\""],
18 => ["type" => "literal", "value" => "}", "description" => "\"}\""],
19 => ["type" => "literal", "value" => "for", "description" => "\"for\""],
20 => ["type" => "literal", "value" => "case", "description" => "\"case\""],
21 => ["type" => "literal", "value" => "esac", "description" => "\"esac\""],
22 => ["type" => "literal", "value" => "if", "description" => "\"if\""],
23 => ["type" => "literal", "value" => "then", "description" => "\"then\""],
24 => ["type" => "literal", "value" => "fi", "description" => "\"fi\""],
25 => ["type" => "literal", "value" => "while", "description" => "\"while\""],
26 => ["type" => "literal", "value" => "until", "description" => "\"until\""],
27 => ["type" => "class", "value" => "[0-9]", "description" => "[0-9]"],
28 => ["type" => "literal", "value" => "'", "description" => "\"'\""],
29 => ["type" => "class", "value" => "[^']", "description" => "[^']"],
30 => ["type" => "literal", "value" => "\"", "description" => "\"\\\"\""],
31 => ["type" => "literal", "value" => "\\", "description" => "\"\\\\\""],
32 => ["type" => "class", "value" => "[^\"`\$\\\\]", "description" => "[^\"`\$\\\\]"],
33 => ["type" => "literal", "value" => "`", "description" => "\"`\""],
34 => ["type" => "literal", "value" => "\$", "description" => "\"\$\""],
35 => ["type" => "class", "value" => "[^`\$\\\\]", "description" => "[^`\$\\\\]"],
36 => ["type" => "class", "value" => "[^'\"\\\\`\$ \\t\\v\\r\\f\\n&|;<>(){}]", "description" => "[^'\"\\\\`\$ \\t\\v\\r\\f\\n&|;<>(){}]"],
37 => ["type" => "class", "value" => "[^'\"\\\\`\$ \\t\\v\\r\\f\\n&|;<>()]", "description" => "[^'\"\\\\`\$ \\t\\v\\r\\f\\n&|;<>()]"],
38 => ["type" => "literal", "value" => "else", "description" => "\"else\""],
39 => ["type" => "literal", "value" => "elif", "description" => "\"elif\""],
40 => ["type" => "literal", "value" => "do", "description" => "\"do\""],
41 => ["type" => "literal", "value" => "done", "description" => "\"done\""],
42 => ["type" => "literal", "value" => "in", "description" => "\"in\""],
43 => ["type" => "literal", "value" => "<&", "description" => "\"<&\""],
44 => ["type" => "literal", "value" => "<>", "description" => "\"<>\""],
45 => ["type" => "literal", "value" => "<", "description" => "\"<\""],
46 => ["type" => "literal", "value" => ">&", "description" => "\">&\""],
47 => ["type" => "literal", "value" => ">>", "description" => "\">>\""],
48 => ["type" => "literal", "value" => ">|", "description" => "\">|\""],
49 => ["type" => "literal", "value" => ">", "description" => "\">\""],
50 => ["type" => "literal", "value" => "<<-", "description" => "\"<<-\""],
51 => ["type" => "literal", "value" => "<<", "description" => "\"<<\""],
52 => ["type" => "class", "value" => "[\$`\"\\\\\\n]", "description" => "[\$`\"\\\\\\n]"],
53 => ["type" => "class", "value" => "[\$\\\\]", "description" => "[\$\\\\]"],
54 => ["type" => "literal", "value" => "\\`", "description" => "\"\\\\`\""],
55 => ["type" => "class", "value" => "[@*#?\\-\$!0]", "description" => "[@*#?\\-\$!0]"],
56 => ["type" => "class", "value" => "[1-9]", "description" => "[1-9]"],
57 => ["type" => "literal", "value" => "((", "description" => "\"((\""],
58 => ["type" => "literal", "value" => "))", "description" => "\"))\""],
59 => ["type" => "literal", "value" => ":", "description" => "\":\""],
60 => ["type" => "class", "value" => "[\\-=?+]", "description" => "[\\-=?+]"],
61 => ["type" => "literal", "value" => "%%", "description" => "\"%%\""],
62 => ["type" => "literal", "value" => "##", "description" => "\"##\""],
63 => ["type" => "class", "value" => "[%#\\-=?+]", "description" => "[%#\\-=?+]"],
	];

	// actions
	private function a0($commands) {

		return $this->node( 'program', $commands );
	
}
private function a1() {

		return $this->node( 'program', [] );
	
}
private function a2($c) {

			return $c;
		
}
private function a3($item, $separator) {

				if ( $separator && $separator[0] === '&' ) {
					return $this->node( 'background', $item );
				} else {
					return $item;
				}
			
}
private function a4($nodes, $last) {

			if ( $last ) {
                $nodes[] = $last;
            }
            if ( count( $nodes ) > 1 ) {
                return $this->node( 'list', $nodes );
            } else {
                return $nodes[0];
            }
		
}
private function a5($list) {

	return $this->node( 'complete_command', $list );

}
private function a6($first, $pipeline) {

			return $this->node( 'and_if', $pipeline );
		
}
private function a7($first, $pipeline) {

			return $this->node( 'or_if', $pipeline );
		
}
private function a8($first, $rest) {

	return $this->merge( $first, $rest );

}
private function a9($bang, $pipeline) {

	if ( $bang !== null ) {
		return $this->node( 'bang', $pipeline );
	} else {
		return $pipeline;
	}

}
private function a10($first, $command) {

			return $command;
		
}
private function a11($first, $rest) {

	if ( count( $rest ) ) {
		return $this->node( 'pipeline', $this->merge( $first, $rest ) );
	} else {
		return $first;
	}

}
private function a12($c, $r) {

		if ( $r !== null ) {
			return $this->merge( $c, $r );
		} else {
			return $c;
		}
	
}
private function a13($fname, $body) {

	return $this->node( 'function_definition',
		$this->merge( $this->node( 'function_name', $fname ), $body ) );

}
private function a14($prefix, $word, $suffix) {

		$contents = [ $prefix, $word ];
		if ( $suffix !== null ) {
			$contents = array_merge( $contents, $suffix );
		}
		return $this->node( 'simple_command', $contents );
	
}
private function a15($prefix) {

		return $this->node( 'simple_command', [ $prefix ] );
	
}
private function a16($name, $suffix) {

		$contents = [ $name ];
		if ( $suffix ) {
			$contents = array_merge( $contents, $suffix );
		}
		return $this->node( 'simple_command', $contents );
	
}
private function a17($c, $r) {

	if ( $r !== null ) {
		return $this->merge( $c, $r );
	} else {
		return $c;
	}

}
private function a18($contents) {

	return $this->node( 'cmd_prefix', $contents );

}
private function a19($parts) {

	return $this->node( 'word', $parts );

}
private function a20($word) {

	return $word;

}
private function a21($list) {

	return $this->node( 'brace_group', $list );

}
private function a22($list) {

	return $this->node( 'subshell', $list );

}
private function a23($name, $wordlist, $do_group) {

			return $this->node( 'for', [ $name, $this->node( 'in', $wordlist ?: [] ), $do_group ] );
		
}
private function a24($name, $do_group) {

			return $this->node( 'for', [ $name, $do_group ] );
		
}
private function a25($word, $list_esac) {

	if ( is_array( $list_esac ) ) {
		$list = $list_esac[0];
	} else {
		$list = [];
	}
	return $this->node( 'case', [ $word, $this->node( 'in', $list ) ] );

}
private function a26($condition, $consequent, $else_part) {

	$contents = [
		$this->node( 'condition', $condition ),
		$this->node( 'consequent', $consequent )
	];
	if ( $else_part !== null ) {
		$contents = $this->merge( $contents, $else_part );
	}
	return $this->node( 'if', $contents );

}
private function a27($list, $body) {

	return $this->node( 'while', [
		$this->node( 'condition', $list ),
		$body
	] );

}
private function a28($list, $body) {

	return $this->node( 'until', [
		$this->node( 'condition', $list ),
		$body
	] );

}
private function a29($number, $file_or_here) {

		$contents = [];
		if ( $number !== null ) {
			$contents[] = $this->node( 'io_subject', $number );
		}
		$contents[] = $file_or_here;
		return $this->node( 'io_redirect', $contents );
	
}
private function a30($name, $word) {

	return $this->node( 'assignment', [ $this->node( 'name', $name ), $word ] );

}
private function a31($term, $separator) {

			if ( $separator && $separator[0] === '&' ) {
				return $this->node( 'background', $term );
			} else {
				return $term;
			}
		
}
private function a32($terms, $last) {

		if ( $last ) {
			$terms[] = $last;
		}
		return $terms;
	
}
private function a33($term) {

		if ( $term === null ) {
			// Phan is convinced $term may be null, not sure how
			return [];
		} else {
			return $term;
		}
	
}
private function a34($name) {

	return $name;

}
private function a35($list) {

	return $this->node( 'do', $list );

}
private function a36($list, $item) {

		$list[] = $item;
		return $list;
	
}
private function a37($item) {

		return [ $item ];
	
}
private function a38($condition, $consequent, $else_part) {

		$contents = [
			$this->node( 'elif_condition', $condition ),
			$this->node( 'elif_consequent', $consequent )
		];
		if ( $else_part !== null ) {
			$contents = $this->merge( $contents, $else_part );
		}
		return $contents;
	
}
private function a39($alternative) {

		return [ $this->node( 'else', $alternative ) ];
	
}
private function a40($filename) {

		return $this->node( 'duplicate_input', $filename );
	
}
private function a41($filename) {

		return $this->node( 'read_and_write', $filename );
	
}
private function a42($filename) {

		return $this->node( 'input', $filename );
	
}
private function a43($filename) {

		return $this->node( 'duplicate_output', $filename );
	
}
private function a44($filename) {

		return $this->node( 'append_output', $filename );
	
}
private function a45($filename) {

		return $this->node( 'clobber', $filename );
	
}
private function a46($filename) {

		return $this->node( 'output', $filename );
	
}
private function a47() {
 return 'io_here_strip'; 
}
private function a48() {
 return 'io_here'; 
}
private function a49($op, $end) {
	// @phan-suppress-previous-line PhanPluginNeverReturnMethod
	// TODO: this is quite complicated to implement, especially given the way
	// the parser is structured.
	throw new UnimplementedError( 'heredoc is not implemented' );
	// For phan
	// @phan-suppress-next-line PhanPluginUnreachableCode
	return $this->node( 'io_here', '' );

}
private function a50($contents) {

	return $this->node( 'single_quote', $contents );

}
private function a51($contents) {

	return $this->node( 'double_quote', $contents );

}
private function a52($contents) {

	return $this->node( 'bare_escape', $contents );

}
private function a53($parts) {

	return $this->node( 'backquote', $parts );

}
private function a54($contents) {

	return $contents;

}
private function a55($plain) {

	return $this->node( 'unquoted_literal', $plain );

}
private function a56($pattern, $list) {

		return $this->node( 'case_item', [
			$pattern,
			$this->node( 'case_consequent', $list )
		] );
	
}
private function a57($pattern) {

		return $this->node( 'case_item', $pattern );
	
}
private function a58($pattern) {

		return $this->node( 'case_item', [ $pattern ] );
	
}
private function a59($contents) {

	return $this->node( 'dquoted_escape', $contents );

}
private function a60($contents) {

	return $this->node( 'backquoted_escape', $contents );

}
private function a61($parts) {

	return $this->node( 'double_backquote', $parts );

}
private function a62($contents) {

	return $this->node( 'special_parameter', $contents );

}
private function a63($contents) {

	return $this->node( 'positional_parameter', $contents );

}
private function a64($words) {

	return $this->node( 'arithmetic_expansion', $words );

}
private function a65($command) {

	return $this->node( 'command_expansion', $command );

}
private function a66($name) {

	return $this->node( 'named_parameter', $name );

}
private function a67($first, $rest) {

	$patterns = [ $first ];
	foreach ( $rest as $pattern ) {
		$patterns[] = $pattern[1];
	}
	return $this->node( 'case_pattern', $patterns );

}
private function a68($parameter, $operator, $word) {

	$names = [
		':-' => 'use_default',
		'-' => 'use_default_unset',
		':=' => 'assign_default',
		'=' => 'assign_default_unset',
		':?' => 'indicate_error',
		'?' => 'indicate_error_unset',
		':+' => 'use_alternative',
		'+' => 'use_alternative_unset',
		'%' => 'remove_smallest_suffix',
		'%%' => 'remove_largest_suffix',
		'#' => 'remove_smallest_prefix',
		'##' => 'remove_largest_prefix'
	];
	if ( !isset( $names[$operator] ) ) {
		throw new InternalError( "Unable to find operator \"$operator\"" );
	}
	return $this->node( $names[$operator], [ $parameter, $word ?? '' ] );

}
private function a69($parameter) {

	return $this->node( 'string_length', $parameter );

}
private function a70($parameter) {

	return $this->node( 'braced_parameter_expansion', $parameter );

}
private function a71($parameter) {

	return $this->node( 'positional_parameter', $parameter );

}

	// generated
	private function parseprogram($silence) {
  $key = json_encode([0,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start choice_1
  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->discardlinebreak($silence);
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = $this->parsecomplete_commands($silence);
  // commands <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r6 = $this->discardlinebreak($silence);
  if ($r6===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a0($r5);
    goto choice_1;
  }
  // free $p3
  $p3 = $this->currPos;
  $r1 = $this->discardlinebreak($silence);
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p3;
    $r1 = $this->a1();
  }
  choice_1:
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function discardlinebreak($silence) {
  $key = json_encode([77,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $r1 = $this->discardnewline_list($silence);
  if ($r1===self::$FAILED) {
    $r1 = null;
  }
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsecomplete_commands($silence) {
  $key = json_encode([2,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $r1 = [];
  for (;;) {
    // start choice_1
    $p3 = $this->currPos;
    // start seq_1
    $p4 = $this->currPos;
    $r5 = $this->parsecomplete_command($silence, 0x0);
    // c <- $r5
    if ($r5===self::$FAILED) {
      $r2 = self::$FAILED;
      goto seq_1;
    }
    $r6 = $this->discardnewline_list($silence);
    if ($r6===self::$FAILED) {
      $this->currPos = $p4;
      $r2 = self::$FAILED;
      goto seq_1;
    }
    $r2 = true;
    seq_1:
    if ($r2!==self::$FAILED) {
      $this->savedPos = $p3;
      $r2 = $this->a2($r5);
      goto choice_1;
    }
    // free $p4
    $r2 = $this->parsecomplete_command($silence, 0x0);
    choice_1:
    if ($r2!==self::$FAILED) {
      $r1[] = $r2;
    } else {
      break;
    }
  }
  // free $r2
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function discardnewline_list($silence) {
  $key = json_encode([75,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $r1 = self::$FAILED;
  for (;;) {
    $r2 = $this->discardNEWLINE($silence);
    if ($r2!==self::$FAILED) {
      $r1 = true;
    } else {
      break;
    }
  }
  // free $r2
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsecomplete_command($silence, $boolParams) {
  $key = json_encode([4,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->discardOWS($silence);
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  // start choice_1
  $p6 = $this->currPos;
  // start seq_2
  $p7 = $this->currPos;
  $r8 = [];
  for (;;) {
    $p10 = $this->currPos;
    // start seq_3
    $p11 = $this->currPos;
    $r12 = $this->parseand_or($silence, $boolParams);
    // item <- $r12
    if ($r12===self::$FAILED) {
      $r9 = self::$FAILED;
      goto seq_3;
    }
    $p14 = $this->currPos;
    $r13 = $this->discardseparator_op($silence);
    // separator <- $r13
    if ($r13!==self::$FAILED) {
      $r13 = substr($this->input, $p14, $this->currPos - $p14);
    } else {
      $r13 = self::$FAILED;
      $this->currPos = $p11;
      $r9 = self::$FAILED;
      goto seq_3;
    }
    // free $p14
    $r9 = true;
    seq_3:
    if ($r9!==self::$FAILED) {
      $this->savedPos = $p10;
      $r9 = $this->a3($r12, $r13);
      $r8[] = $r9;
    } else {
      break;
    }
    // free $p11
  }
  if (count($r8) === 0) {
    $r8 = self::$FAILED;
  }
  // nodes <- $r8
  if ($r8===self::$FAILED) {
    $r5 = self::$FAILED;
    goto seq_2;
  }
  // free $r9
  $r9 = $this->parseand_or($silence, $boolParams);
  if ($r9===self::$FAILED) {
    $r9 = null;
  }
  // last <- $r9
  $r5 = true;
  seq_2:
  if ($r5!==self::$FAILED) {
    $this->savedPos = $p6;
    $r5 = $this->a4($r8, $r9);
    goto choice_1;
  }
  // free $p7
  $r5 = $this->parseand_or($silence, $boolParams);
  choice_1:
  // list <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a5($r5);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function discardNEWLINE($silence) {
  $key = json_encode([205,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if (($this->input[$this->currPos] ?? null) === "\x0a") {
    $this->currPos++;
    $r3 = "\x0a";
  } else {
    if (!$silence) {$this->fail(1);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardOWS($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function discardOWS($silence) {
  $key = json_encode([153,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  for (;;) {
    if (strspn($this->input, " \x09\x0b\x0d\x0c", $this->currPos, 1) !== 0) {
      $r4 = $this->input[$this->currPos++];
    } else {
      $r4 = self::$FAILED;
      if (!$silence) {$this->fail(2);}
      break;
    }
  }
  // free $r4
  $r3 = true;
  if ($r3===self::$FAILED) {
    $r2 = self::$FAILED;
    goto seq_1;
  }
  // free $r3
  // start seq_2
  $p5 = $this->currPos;
  if (($this->input[$this->currPos] ?? null) === "#") {
    $this->currPos++;
    $r4 = "#";
  } else {
    if (!$silence) {$this->fail(3);}
    $r4 = self::$FAILED;
    $r3 = self::$FAILED;
    goto seq_2;
  }
  for (;;) {
    $r7 = self::charAt($this->input, $this->currPos);
    if ($r7 !== '' && !($r7 === "\x0a")) {
      $this->currPos += strlen($r7);
    } else {
      $r7 = self::$FAILED;
      if (!$silence) {$this->fail(4);}
      break;
    }
  }
  // free $r7
  $r6 = true;
  if ($r6===self::$FAILED) {
    $this->currPos = $p5;
    $r3 = self::$FAILED;
    goto seq_2;
  }
  // free $r6
  $r3 = true;
  seq_2:
  if ($r3===self::$FAILED) {
    $r3 = null;
  }
  // free $p5
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function parseand_or($silence, $boolParams) {
  $key = json_encode([6,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->parsepipeline($silence, $boolParams);
  // first <- $r4
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = [];
  for (;;) {
    // start choice_1
    $p7 = $this->currPos;
    // start seq_2
    $p8 = $this->currPos;
    $r9 = $this->discardAND_IF($silence);
    if ($r9===self::$FAILED) {
      $r6 = self::$FAILED;
      goto seq_2;
    }
    $r10 = $this->discardlinebreak($silence);
    if ($r10===self::$FAILED) {
      $this->currPos = $p8;
      $r6 = self::$FAILED;
      goto seq_2;
    }
    $r11 = $this->parsepipeline($silence, $boolParams);
    // pipeline <- $r11
    if ($r11===self::$FAILED) {
      $this->currPos = $p8;
      $r6 = self::$FAILED;
      goto seq_2;
    }
    $r6 = true;
    seq_2:
    if ($r6!==self::$FAILED) {
      $this->savedPos = $p7;
      $r6 = $this->a6($r4, $r11);
      goto choice_1;
    }
    // free $p8
    $p8 = $this->currPos;
    // start seq_3
    $p12 = $this->currPos;
    $r13 = $this->discardOR_IF($silence);
    if ($r13===self::$FAILED) {
      $r6 = self::$FAILED;
      goto seq_3;
    }
    $r14 = $this->discardlinebreak($silence);
    if ($r14===self::$FAILED) {
      $this->currPos = $p12;
      $r6 = self::$FAILED;
      goto seq_3;
    }
    $r15 = $this->parsepipeline($silence, $boolParams);
    // pipeline <- $r15
    if ($r15===self::$FAILED) {
      $this->currPos = $p12;
      $r6 = self::$FAILED;
      goto seq_3;
    }
    $r6 = true;
    seq_3:
    if ($r6!==self::$FAILED) {
      $this->savedPos = $p8;
      $r6 = $this->a7($r4, $r15);
      goto choice_1;
    }
    // free $p12
    $r6 = $this->parsepipeline($silence, $boolParams);
    choice_1:
    if ($r6!==self::$FAILED) {
      $r5[] = $r6;
    } else {
      break;
    }
  }
  // rest <- $r5
  // free $r6
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a8($r4, $r5);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function discardseparator_op($silence) {
  $key = json_encode([79,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start choice_1
  $r1 = $this->discardAND($silence);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->discardSEMI($silence);
  choice_1:
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsepipeline($silence, $boolParams) {
  $key = json_encode([8,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->parseBang($silence);
  if ($r4===self::$FAILED) {
    $r4 = null;
  }
  // bang <- $r4
  $r5 = $this->parsepipe_sequence($silence, $boolParams);
  // pipeline <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a9($r4, $r5);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function discardAND_IF($silence) {
  $key = json_encode([85,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "&&", $this->currPos, 2, false) === 0) {
    $r3 = "&&";
    $this->currPos += 2;
  } else {
    if (!$silence) {$this->fail(5);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardOWS($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function discardOR_IF($silence) {
  $key = json_encode([87,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "||", $this->currPos, 2, false) === 0) {
    $r3 = "||";
    $this->currPos += 2;
  } else {
    if (!$silence) {$this->fail(6);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardOWS($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function discardAND($silence) {
  $key = json_encode([139,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  $p3 = $this->currPos;
  $r4 = $this->discardAND_IF(true);
  if ($r4 === self::$FAILED) {
    $r4 = false;
  } else {
    $r4 = self::$FAILED;
    $this->currPos = $p3;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  // free $p3
  if (($this->input[$this->currPos] ?? null) === "&") {
    $this->currPos++;
    $r5 = "&";
  } else {
    if (!$silence) {$this->fail(7);}
    $r5 = self::$FAILED;
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r6 = $this->discardOWS($silence);
  if ($r6===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function discardSEMI($silence) {
  $key = json_encode([141,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  $p3 = $this->currPos;
  $r4 = $this->discardDSEMI(true);
  if ($r4 === self::$FAILED) {
    $r4 = false;
  } else {
    $r4 = self::$FAILED;
    $this->currPos = $p3;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  // free $p3
  if (($this->input[$this->currPos] ?? null) === ";") {
    $this->currPos++;
    $r5 = ";";
  } else {
    if (!$silence) {$this->fail(8);}
    $r5 = self::$FAILED;
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r6 = $this->discardOWS($silence);
  if ($r6===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function parseBang($silence) {
  $key = json_encode([132,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if (($this->input[$this->currPos] ?? null) === "!") {
    $this->currPos++;
    $r3 = "!";
  } else {
    if (!$silence) {$this->fail(9);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->parseDELIM($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = [$r3,$r4];
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function parsepipe_sequence($silence, $boolParams) {
  $key = json_encode([10,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->parsecommand($silence, $boolParams);
  // first <- $r4
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = [];
  for (;;) {
    $p7 = $this->currPos;
    // start seq_2
    $p8 = $this->currPos;
    $r9 = $this->discardPIPE($silence);
    if ($r9===self::$FAILED) {
      $r6 = self::$FAILED;
      goto seq_2;
    }
    $r10 = $this->discardlinebreak($silence);
    if ($r10===self::$FAILED) {
      $this->currPos = $p8;
      $r6 = self::$FAILED;
      goto seq_2;
    }
    $r11 = $this->parsecommand($silence, $boolParams);
    // command <- $r11
    if ($r11===self::$FAILED) {
      $this->currPos = $p8;
      $r6 = self::$FAILED;
      goto seq_2;
    }
    $r6 = true;
    seq_2:
    if ($r6!==self::$FAILED) {
      $this->savedPos = $p7;
      $r6 = $this->a10($r4, $r11);
      $r5[] = $r6;
    } else {
      break;
    }
    // free $p8
  }
  // rest <- $r5
  // free $r6
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a11($r4, $r5);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function discardDSEMI($silence) {
  $key = json_encode([89,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, ";;", $this->currPos, 2, false) === 0) {
    $r3 = ";;";
    $this->currPos += 2;
  } else {
    if (!$silence) {$this->fail(10);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardOWS($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function parseDELIM($silence) {
  $key = json_encode([154,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start choice_1
  $r1 = [];
  for (;;) {
    if (strspn($this->input, " \x09\x0b\x0d\x0c", $this->currPos, 1) !== 0) {
      $r2 = $this->input[$this->currPos++];
      $r1[] = $r2;
    } else {
      $r2 = self::$FAILED;
      if (!$silence) {$this->fail(2);}
      break;
    }
  }
  if (count($r1) === 0) {
    $r1 = self::$FAILED;
  }
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  // free $r2
  $p3 = $this->currPos;
  if ($this->currPos < $this->inputLength) {
    $r1 = self::consumeChar($this->input, $this->currPos);;
  } else {
    $r1 = self::$FAILED;
  }
  if ($r1 === self::$FAILED) {
    $r1 = false;
    goto choice_1;
  } else {
    $r1 = self::$FAILED;
    $this->currPos = $p3;
  }
  // free $p3
  $p3 = $this->currPos;
  if (($this->input[$this->currPos] ?? null) === "\x0a") {
    $this->currPos++;
    $r1 = "\x0a";
    $r1 = false;
    $this->currPos = $p3;
  } else {
    $r1 = self::$FAILED;
  }
  // free $p3
  choice_1:
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsecommand($silence, $boolParams) {
  $key = json_encode([12,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start choice_1
  $r1 = $this->parsefunction_definition($silence, $boolParams);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->parsesimple_command($silence, $boolParams);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->parsecompound_command($silence, $boolParams);
  // c <- $r4
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = $this->parseredirect_list($silence, $boolParams);
  if ($r5===self::$FAILED) {
    $r5 = null;
  }
  // r <- $r5
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a12($r4, $r5);
  }
  // free $p3
  choice_1:
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function discardPIPE($silence) {
  $key = json_encode([147,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  $p3 = $this->currPos;
  $r4 = $this->discardOR_IF(true);
  if ($r4 === self::$FAILED) {
    $r4 = false;
  } else {
    $r4 = self::$FAILED;
    $this->currPos = $p3;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  // free $p3
  if (($this->input[$this->currPos] ?? null) === "|") {
    $this->currPos++;
    $r5 = "|";
  } else {
    if (!$silence) {$this->fail(11);}
    $r5 = self::$FAILED;
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r6 = $this->discardOWS($silence);
  if ($r6===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function parsefunction_definition($silence, $boolParams) {
  $key = json_encode([48,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->parseNAME($silence);
  // fname <- $r4
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = $this->discardLPAREN($silence);
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r6 = $this->discardRPAREN($silence);
  if ($r6===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r7 = $this->discardlinebreak($silence);
  if ($r7===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r8 = $this->parsefunction_body($silence, $boolParams);
  // body <- $r8
  if ($r8===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a13($r4, $r8);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsesimple_command($silence, $boolParams) {
  $key = json_encode([56,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start choice_1
  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->parsecmd_prefix($silence, $boolParams);
  // prefix <- $r4
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = $this->parseWORD($silence, $boolParams);
  // word <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r6 = $this->parsecmd_suffix($silence, $boolParams);
  if ($r6===self::$FAILED) {
    $r6 = null;
  }
  // suffix <- $r6
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a14($r4, $r5, $r6);
    goto choice_1;
  }
  // free $p3
  $p3 = $this->currPos;
  $r7 = $this->parsecmd_prefix($silence, $boolParams);
  // prefix <- $r7
  $r1 = $r7;
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p3;
    $r1 = $this->a15($r7);
    goto choice_1;
  }
  $p8 = $this->currPos;
  // start seq_2
  $p9 = $this->currPos;
  $r10 = $this->parsecmd_name($silence, $boolParams);
  // name <- $r10
  if ($r10===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_2;
  }
  $r11 = $this->parsecmd_suffix($silence, $boolParams);
  if ($r11===self::$FAILED) {
    $r11 = null;
  }
  // suffix <- $r11
  $r1 = true;
  seq_2:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p8;
    $r1 = $this->a16($r10, $r11);
  }
  // free $p9
  choice_1:
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsecompound_command($silence, $boolParams) {
  $key = json_encode([14,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start choice_1
  $r1 = $this->parsebrace_group($silence, $boolParams);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->parsesubshell($silence, $boolParams);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->parsefor_clause($silence, $boolParams);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->parsecase_clause($silence, $boolParams);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->parseif_clause($silence, $boolParams);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->parsewhile_clause($silence, $boolParams);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->parseuntil_clause($silence, $boolParams);
  choice_1:
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parseredirect_list($silence, $boolParams) {
  $key = json_encode([64,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $r1 = [];
  for (;;) {
    $r2 = $this->parseio_redirect($silence, $boolParams);
    if ($r2!==self::$FAILED) {
      $r1[] = $r2;
    } else {
      break;
    }
  }
  if (count($r1) === 0) {
    $r1 = self::$FAILED;
  }
  // free $r2
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parseNAME($silence) {
  $key = json_encode([202,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p1 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->input[$this->currPos] ?? '';
  if (preg_match("/^[_a-zA-Z]/", $r4)) {
    $this->currPos++;
  } else {
    $r4 = self::$FAILED;
    if (!$silence) {$this->fail(12);}
    $r2 = self::$FAILED;
    goto seq_1;
  }
  for (;;) {
    $r6 = $this->input[$this->currPos] ?? '';
    if (preg_match("/^[_a-zA-Z0-9]/", $r6)) {
      $this->currPos++;
    } else {
      $r6 = self::$FAILED;
      if (!$silence) {$this->fail(13);}
      break;
    }
  }
  // free $r6
  $r5 = true;
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  // free $r5
  $r2 = true;
  seq_1:
  if ($r2!==self::$FAILED) {
    $r2 = substr($this->input, $p1, $this->currPos - $p1);
  } else {
    $r2 = self::$FAILED;
  }
  // free $p3
  // free $p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function discardLPAREN($silence) {
  $key = json_encode([149,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if (($this->input[$this->currPos] ?? null) === "(") {
    $this->currPos++;
    $r3 = "(";
  } else {
    if (!$silence) {$this->fail(14);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardOWS($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function discardRPAREN($silence) {
  $key = json_encode([151,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if (($this->input[$this->currPos] ?? null) === ")") {
    $this->currPos++;
    $r3 = ")";
  } else {
    if (!$silence) {$this->fail(15);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardOWS($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function parsefunction_body($silence, $boolParams) {
  $key = json_encode([50,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->parsecompound_command($silence, $boolParams);
  // c <- $r4
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = $this->parseredirect_list($silence, $boolParams);
  if ($r5===self::$FAILED) {
    $r5 = null;
  }
  // r <- $r5
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a17($r4, $r5);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsecmd_prefix($silence, $boolParams) {
  $key = json_encode([60,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  $r3 = [];
  for (;;) {
    // start choice_1
    $r4 = $this->parseio_redirect($silence, $boolParams);
    if ($r4!==self::$FAILED) {
      goto choice_1;
    }
    $r4 = $this->parseASSIGNMENT_WORD($silence, $boolParams);
    choice_1:
    if ($r4!==self::$FAILED) {
      $r3[] = $r4;
    } else {
      break;
    }
  }
  if (count($r3) === 0) {
    $r3 = self::$FAILED;
  }
  // contents <- $r3
  // free $r4
  $r1 = $r3;
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a18($r3);
  }
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parseWORD($silence, $boolParams) {
  $key = json_encode([156,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = [];
  for (;;) {
    $r5 = $this->parseword_part($silence, $boolParams);
    if ($r5!==self::$FAILED) {
      $r4[] = $r5;
    } else {
      break;
    }
  }
  if (count($r4) === 0) {
    $r4 = self::$FAILED;
  }
  // parts <- $r4
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  // free $r5
  $r5 = $this->discardOWS($silence);
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a19($r4);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsecmd_suffix($silence, $boolParams) {
  $key = json_encode([62,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $r1 = [];
  for (;;) {
    // start choice_1
    $r2 = $this->parseio_redirect($silence, $boolParams);
    if ($r2!==self::$FAILED) {
      goto choice_1;
    }
    $r2 = $this->parseWORD($silence, $boolParams);
    choice_1:
    if ($r2!==self::$FAILED) {
      $r1[] = $r2;
    } else {
      break;
    }
  }
  if (count($r1) === 0) {
    $r1 = self::$FAILED;
  }
  // free $r2
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsecmd_name($silence, $boolParams) {
  $key = json_encode([58,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $p4 = $this->currPos;
  $r5 = $this->discardreserved(true);
  if ($r5 === self::$FAILED) {
    $r5 = false;
  } else {
    $r5 = self::$FAILED;
    $this->currPos = $p4;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  // free $p4
  $r6 = $this->parseWORD($silence, $boolParams);
  // word <- $r6
  if ($r6===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a20($r6);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsebrace_group($silence, $boolParams) {
  $key = json_encode([52,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->discardLbrace($silence);
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = $this->parsecompound_list($silence, $boolParams);
  // list <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r6 = $this->discardRbrace($silence);
  if ($r6===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a21($r5);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsesubshell($silence, $boolParams) {
  $key = json_encode([16,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->discardLPAREN($silence);
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = $this->parsecompound_list($silence, $boolParams);
  // list <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r6 = $this->discardRPAREN($silence);
  if ($r6===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a22($r5);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsefor_clause($silence, $boolParams) {
  $key = json_encode([20,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start choice_1
  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->discardFor($silence);
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = $this->parsefor_name($silence);
  // name <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r6 = $this->discardlinebreak($silence);
  if ($r6===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r7 = $this->discardfor_case_in($silence);
  if ($r7===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r8 = $this->parsewordlist($silence, $boolParams);
  if ($r8===self::$FAILED) {
    $r8 = null;
  }
  // wordlist <- $r8
  $r9 = $this->discardsequential_sep($silence);
  if ($r9===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r10 = $this->parsedo_group($silence, $boolParams);
  // do_group <- $r10
  if ($r10===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a23($r5, $r8, $r10);
    goto choice_1;
  }
  // free $p3
  $p3 = $this->currPos;
  // start seq_2
  $p11 = $this->currPos;
  $r12 = $this->discardFor($silence);
  if ($r12===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_2;
  }
  $r13 = $this->parsefor_name($silence);
  // name <- $r13
  if ($r13===self::$FAILED) {
    $this->currPos = $p11;
    $r1 = self::$FAILED;
    goto seq_2;
  }
  $r14 = $this->discardsequential_sep($silence);
  if ($r14===self::$FAILED) {
    $r14 = null;
  }
  $r15 = $this->parsedo_group($silence, $boolParams);
  // do_group <- $r15
  if ($r15===self::$FAILED) {
    $this->currPos = $p11;
    $r1 = self::$FAILED;
    goto seq_2;
  }
  $r1 = true;
  seq_2:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p3;
    $r1 = $this->a24($r13, $r15);
  }
  // free $p11
  choice_1:
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsecase_clause($silence, $boolParams) {
  $key = json_encode([28,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->discardCase($silence);
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = $this->parseWORD($silence, $boolParams);
  // word <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r6 = $this->discardlinebreak($silence);
  if ($r6===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r7 = $this->discardfor_case_in($silence);
  if ($r7===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r8 = $this->discardlinebreak($silence);
  if ($r8===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  // start choice_1
  // start seq_2
  $p10 = $this->currPos;
  $r11 = $this->parsecase_list($silence, $boolParams);
  if ($r11===self::$FAILED) {
    $r9 = self::$FAILED;
    goto seq_2;
  }
  $p12 = $this->currPos;
  $r13 = $this->discardEsac($silence);
  if ($r13!==self::$FAILED) {
    $r13 = substr($this->input, $p12, $this->currPos - $p12);
  } else {
    $r13 = self::$FAILED;
    $this->currPos = $p10;
    $r9 = self::$FAILED;
    goto seq_2;
  }
  // free $p12
  $r9 = [$r11,$r13];
  seq_2:
  if ($r9!==self::$FAILED) {
    goto choice_1;
  }
  // free $p10
  // start seq_3
  $p10 = $this->currPos;
  $r14 = $this->parsecase_list_ns($silence, $boolParams);
  if ($r14===self::$FAILED) {
    $r9 = self::$FAILED;
    goto seq_3;
  }
  $p12 = $this->currPos;
  $r15 = $this->discardEsac($silence);
  if ($r15!==self::$FAILED) {
    $r15 = substr($this->input, $p12, $this->currPos - $p12);
  } else {
    $r15 = self::$FAILED;
    $this->currPos = $p10;
    $r9 = self::$FAILED;
    goto seq_3;
  }
  // free $p12
  $r9 = [$r14,$r15];
  seq_3:
  if ($r9!==self::$FAILED) {
    goto choice_1;
  }
  // free $p10
  $p10 = $this->currPos;
  $r9 = $this->discardEsac($silence);
  if ($r9!==self::$FAILED) {
    $r9 = substr($this->input, $p10, $this->currPos - $p10);
  } else {
    $r9 = self::$FAILED;
  }
  // free $p10
  choice_1:
  // list_esac <- $r9
  if ($r9===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a25($r5, $r9);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parseif_clause($silence, $boolParams) {
  $key = json_encode([40,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->discardIf($silence);
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = $this->parsecompound_list($silence, $boolParams);
  // condition <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r6 = $this->discardThen($silence);
  if ($r6===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r7 = $this->parsecompound_list($silence, $boolParams);
  // consequent <- $r7
  if ($r7===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r8 = $this->parseelse_part($silence, $boolParams);
  if ($r8===self::$FAILED) {
    $r8 = null;
  }
  // else_part <- $r8
  $r9 = $this->discardFi($silence);
  if ($r9===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a26($r5, $r7, $r8);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsewhile_clause($silence, $boolParams) {
  $key = json_encode([44,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->discardWhile($silence);
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = $this->parsecompound_list($silence, $boolParams);
  // list <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r6 = $this->parsedo_group($silence, $boolParams);
  // body <- $r6
  if ($r6===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a27($r5, $r6);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parseuntil_clause($silence, $boolParams) {
  $key = json_encode([46,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->discardUntil($silence);
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = $this->parsecompound_list($silence, $boolParams);
  // list <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r6 = $this->parsedo_group($silence, $boolParams);
  // body <- $r6
  if ($r6===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a28($r5, $r6);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parseio_redirect($silence, $boolParams) {
  $key = json_encode([66,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->parseIO_NUMBER($silence);
  if ($r4===self::$FAILED) {
    $r4 = null;
  }
  // number <- $r4
  // start choice_1
  $r5 = $this->parseio_file($silence, $boolParams);
  if ($r5!==self::$FAILED) {
    goto choice_1;
  }
  $r5 = $this->parseio_here($silence, $boolParams);
  choice_1:
  // file_or_here <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a29($r4, $r5);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parseASSIGNMENT_WORD($silence, $boolParams) {
  $key = json_encode([200,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->parseNAME($silence);
  // name <- $r4
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  if (($this->input[$this->currPos] ?? null) === "=") {
    $this->currPos++;
    $r5 = "=";
  } else {
    if (!$silence) {$this->fail(16);}
    $r5 = self::$FAILED;
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r6 = $this->parseWORD($silence, $boolParams);
  // word <- $r6
  if ($r6===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a30($r4, $r6);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parseword_part($silence, $boolParams) {
  $key = json_encode([158,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start choice_1
  $r1 = $this->parsesingle_quoted_part($silence);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->parsedouble_quoted_part($silence, $boolParams);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->parsebare_escape_sequence($silence);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->parsebackquote_expansion($silence, $boolParams);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->parsedollar_expansion($silence, $boolParams);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->parseplain_part($silence, $boolParams);
  choice_1:
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function discardreserved($silence) {
  $key = json_encode([137,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start choice_1
  $r1 = $this->discardIf($silence);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->discardThen($silence);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->discardElse($silence);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->discardElif($silence);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->discardFi($silence);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->discardDo($silence);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->discardDone($silence);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->discardCase($silence);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->discardEsac($silence);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->discardWhile($silence);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->discardUntil($silence);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->discardFor($silence);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->discardLbrace($silence);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->discardRbrace($silence);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->discardBang($silence);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->discardIn($silence);
  choice_1:
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function discardLbrace($silence) {
  $key = json_encode([129,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if (($this->input[$this->currPos] ?? null) === "{") {
    $this->currPos++;
    $r3 = "{";
  } else {
    if (!$silence) {$this->fail(17);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardDELIM($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function parsecompound_list($silence, $boolParams) {
  $key = json_encode([18,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start choice_1
  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->discardlinebreak($silence);
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = [];
  for (;;) {
    $p7 = $this->currPos;
    // start seq_2
    $p8 = $this->currPos;
    $r9 = $this->parseand_or($silence, $boolParams);
    // term <- $r9
    if ($r9===self::$FAILED) {
      $r6 = self::$FAILED;
      goto seq_2;
    }
    $p11 = $this->currPos;
    $r10 = $this->discardseparator($silence);
    // separator <- $r10
    if ($r10!==self::$FAILED) {
      $r10 = substr($this->input, $p11, $this->currPos - $p11);
    } else {
      $r10 = self::$FAILED;
      $this->currPos = $p8;
      $r6 = self::$FAILED;
      goto seq_2;
    }
    // free $p11
    $r6 = true;
    seq_2:
    if ($r6!==self::$FAILED) {
      $this->savedPos = $p7;
      $r6 = $this->a31($r9, $r10);
      $r5[] = $r6;
    } else {
      break;
    }
    // free $p8
  }
  if (count($r5) === 0) {
    $r5 = self::$FAILED;
  }
  // terms <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  // free $r6
  $r6 = $this->parseand_or($silence, $boolParams);
  if ($r6===self::$FAILED) {
    $r6 = null;
  }
  // last <- $r6
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a32($r5, $r6);
    goto choice_1;
  }
  // free $p3
  $p3 = $this->currPos;
  // start seq_3
  $p8 = $this->currPos;
  $r12 = $this->discardlinebreak($silence);
  if ($r12===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_3;
  }
  $r13 = $this->parseand_or($silence, $boolParams);
  // term <- $r13
  if ($r13===self::$FAILED) {
    $this->currPos = $p8;
    $r1 = self::$FAILED;
    goto seq_3;
  }
  $r1 = true;
  seq_3:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p3;
    $r1 = $this->a33($r13);
  }
  // free $p8
  choice_1:
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function discardRbrace($silence) {
  $key = json_encode([131,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if (($this->input[$this->currPos] ?? null) === "}") {
    $this->currPos++;
    $r3 = "}";
  } else {
    if (!$silence) {$this->fail(18);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardDELIM($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function discardFor($silence) {
  $key = json_encode([127,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "for", $this->currPos, 3, false) === 0) {
    $r3 = "for";
    $this->currPos += 3;
  } else {
    if (!$silence) {$this->fail(19);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardDELIM($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function parsefor_name($silence) {
  $key = json_encode([22,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->parseNAME($silence);
  // name <- $r4
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = $this->discardOWS($silence);
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a34($r4);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function discardfor_case_in($silence) {
  $key = json_encode([25,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  $r3 = $this->discardIn($silence);
  if ($r3===self::$FAILED) {
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardOWS($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function parsewordlist($silence, $boolParams) {
  $key = json_encode([26,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $r1 = [];
  for (;;) {
    $r2 = $this->parseWORD($silence, $boolParams);
    if ($r2!==self::$FAILED) {
      $r1[] = $r2;
    } else {
      break;
    }
  }
  if (count($r1) === 0) {
    $r1 = self::$FAILED;
  }
  // free $r2
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function discardsequential_sep($silence) {
  $key = json_encode([83,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start choice_1
  // start seq_1
  $p2 = $this->currPos;
  $r3 = $this->discardSEMI($silence);
  if ($r3===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardlinebreak($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p2;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  // free $p2
  $r1 = $this->discardnewline_list($silence);
  choice_1:
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsedo_group($silence, $boolParams) {
  $key = json_encode([54,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->discardDo($silence);
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = $this->parsecompound_list($silence, $boolParams);
  // list <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r6 = $this->discardDone($silence);
  if ($r6===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a35($r5);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function discardCase($silence) {
  $key = json_encode([119,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "case", $this->currPos, 4, false) === 0) {
    $r3 = "case";
    $this->currPos += 4;
  } else {
    if (!$silence) {$this->fail(20);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardDELIM($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function parsecase_list($silence, $boolParams) {
  $key = json_encode([32,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $r1 = [];
  for (;;) {
    $r2 = $this->parsecase_item($silence, $boolParams);
    if ($r2!==self::$FAILED) {
      $r1[] = $r2;
    } else {
      break;
    }
  }
  if (count($r1) === 0) {
    $r1 = self::$FAILED;
  }
  // free $r2
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function discardEsac($silence) {
  $key = json_encode([121,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "esac", $this->currPos, 4, false) === 0) {
    $r3 = "esac";
    $this->currPos += 4;
  } else {
    if (!$silence) {$this->fail(21);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardDELIM($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function parsecase_list_ns($silence, $boolParams) {
  $key = json_encode([30,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start choice_1
  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->parsecase_list($silence, $boolParams);
  // list <- $r4
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = $this->parsecase_item_ns($silence, $boolParams);
  // item <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a36($r4, $r5);
    goto choice_1;
  }
  // free $p3
  $p3 = $this->currPos;
  $r6 = $this->parsecase_item_ns($silence, $boolParams);
  // item <- $r6
  $r1 = $r6;
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p3;
    $r1 = $this->a37($r6);
  }
  choice_1:
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function discardIf($silence) {
  $key = json_encode([105,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "if", $this->currPos, 2, false) === 0) {
    $r3 = "if";
    $this->currPos += 2;
  } else {
    if (!$silence) {$this->fail(22);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardDELIM($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function discardThen($silence) {
  $key = json_encode([107,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "then", $this->currPos, 4, false) === 0) {
    $r3 = "then";
    $this->currPos += 4;
  } else {
    if (!$silence) {$this->fail(23);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardDELIM($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function parseelse_part($silence, $boolParams) {
  $key = json_encode([42,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start choice_1
  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->discardElif($silence);
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = $this->parsecompound_list($silence, $boolParams);
  // condition <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r6 = $this->discardThen($silence);
  if ($r6===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r7 = $this->parsecompound_list($silence, $boolParams);
  // consequent <- $r7
  if ($r7===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r8 = $this->parseelse_part($silence, $boolParams);
  if ($r8===self::$FAILED) {
    $r8 = null;
  }
  // else_part <- $r8
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a38($r5, $r7, $r8);
    goto choice_1;
  }
  // free $p3
  $p3 = $this->currPos;
  // start seq_2
  $p9 = $this->currPos;
  $r10 = $this->discardElse($silence);
  if ($r10===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_2;
  }
  $r11 = $this->parsecompound_list($silence, $boolParams);
  // alternative <- $r11
  if ($r11===self::$FAILED) {
    $this->currPos = $p9;
    $r1 = self::$FAILED;
    goto seq_2;
  }
  $r1 = true;
  seq_2:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p3;
    $r1 = $this->a39($r11);
  }
  // free $p9
  choice_1:
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function discardFi($silence) {
  $key = json_encode([113,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "fi", $this->currPos, 2, false) === 0) {
    $r3 = "fi";
    $this->currPos += 2;
  } else {
    if (!$silence) {$this->fail(24);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardDELIM($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function discardWhile($silence) {
  $key = json_encode([123,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "while", $this->currPos, 5, false) === 0) {
    $r3 = "while";
    $this->currPos += 5;
  } else {
    if (!$silence) {$this->fail(25);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardDELIM($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function discardUntil($silence) {
  $key = json_encode([125,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "until", $this->currPos, 5, false) === 0) {
    $r3 = "until";
    $this->currPos += 5;
  } else {
    if (!$silence) {$this->fail(26);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardDELIM($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function parseIO_NUMBER($silence) {
  $key = json_encode([206,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p1 = $this->currPos;
  $r2 = self::$FAILED;
  for (;;) {
    $r3 = $this->input[$this->currPos] ?? '';
    if (preg_match("/^[0-9]/", $r3)) {
      $this->currPos++;
      $r2 = true;
    } else {
      $r3 = self::$FAILED;
      if (!$silence) {$this->fail(27);}
      break;
    }
  }
  if ($r2!==self::$FAILED) {
    $r2 = substr($this->input, $p1, $this->currPos - $p1);
  } else {
    $r2 = self::$FAILED;
  }
  // free $r3
  // free $p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function parseio_file($silence, $boolParams) {
  $key = json_encode([68,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start choice_1
  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->discardLESSAND($silence);
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = $this->parseWORD($silence, $boolParams);
  // filename <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a40($r5);
    goto choice_1;
  }
  // free $p3
  $p3 = $this->currPos;
  // start seq_2
  $p6 = $this->currPos;
  $r7 = $this->discardLESSGREAT($silence);
  if ($r7===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_2;
  }
  $r8 = $this->parseWORD($silence, $boolParams);
  // filename <- $r8
  if ($r8===self::$FAILED) {
    $this->currPos = $p6;
    $r1 = self::$FAILED;
    goto seq_2;
  }
  $r1 = true;
  seq_2:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p3;
    $r1 = $this->a41($r8);
    goto choice_1;
  }
  // free $p6
  $p6 = $this->currPos;
  // start seq_3
  $p9 = $this->currPos;
  $r10 = $this->discardLESS($silence);
  if ($r10===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_3;
  }
  $r11 = $this->parseWORD($silence, $boolParams);
  // filename <- $r11
  if ($r11===self::$FAILED) {
    $this->currPos = $p9;
    $r1 = self::$FAILED;
    goto seq_3;
  }
  $r1 = true;
  seq_3:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p6;
    $r1 = $this->a42($r11);
    goto choice_1;
  }
  // free $p9
  $p9 = $this->currPos;
  // start seq_4
  $p12 = $this->currPos;
  $r13 = $this->discardGREATAND($silence);
  if ($r13===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_4;
  }
  $r14 = $this->parseWORD($silence, $boolParams);
  // filename <- $r14
  if ($r14===self::$FAILED) {
    $this->currPos = $p12;
    $r1 = self::$FAILED;
    goto seq_4;
  }
  $r1 = true;
  seq_4:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p9;
    $r1 = $this->a43($r14);
    goto choice_1;
  }
  // free $p12
  $p12 = $this->currPos;
  // start seq_5
  $p15 = $this->currPos;
  $r16 = $this->discardDGREAT($silence);
  if ($r16===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_5;
  }
  $r17 = $this->parseWORD($silence, $boolParams);
  // filename <- $r17
  if ($r17===self::$FAILED) {
    $this->currPos = $p15;
    $r1 = self::$FAILED;
    goto seq_5;
  }
  $r1 = true;
  seq_5:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p12;
    $r1 = $this->a44($r17);
    goto choice_1;
  }
  // free $p15
  $p15 = $this->currPos;
  // start seq_6
  $p18 = $this->currPos;
  $r19 = $this->discardCLOBBER($silence);
  if ($r19===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_6;
  }
  $r20 = $this->parseWORD($silence, $boolParams);
  // filename <- $r20
  if ($r20===self::$FAILED) {
    $this->currPos = $p18;
    $r1 = self::$FAILED;
    goto seq_6;
  }
  $r1 = true;
  seq_6:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p15;
    $r1 = $this->a45($r20);
    goto choice_1;
  }
  // free $p18
  $p18 = $this->currPos;
  // start seq_7
  $p21 = $this->currPos;
  $r22 = $this->discardGREAT($silence);
  if ($r22===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_7;
  }
  $r23 = $this->parseWORD($silence, $boolParams);
  // filename <- $r23
  if ($r23===self::$FAILED) {
    $this->currPos = $p21;
    $r1 = self::$FAILED;
    goto seq_7;
  }
  $r1 = true;
  seq_7:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p18;
    $r1 = $this->a46($r23);
  }
  // free $p21
  choice_1:
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parseio_here($silence, $boolParams) {
  $key = json_encode([70,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  // start choice_1
  $p5 = $this->currPos;
  $r4 = $this->discardDLESSDASH($silence);
  if ($r4!==self::$FAILED) {
    $this->savedPos = $p5;
    $r4 = $this->a47();
    goto choice_1;
  }
  $p6 = $this->currPos;
  $r4 = $this->discardDLESS($silence);
  if ($r4!==self::$FAILED) {
    $this->savedPos = $p6;
    $r4 = $this->a48();
  }
  choice_1:
  // op <- $r4
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r7 = $this->parsehere_end($silence, $boolParams);
  // end <- $r7
  if ($r7===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a49($r4, $r7);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsesingle_quoted_part($silence) {
  $key = json_encode([160,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  if (($this->input[$this->currPos] ?? null) === "'") {
    $this->currPos++;
    $r4 = "'";
  } else {
    if (!$silence) {$this->fail(28);}
    $r4 = self::$FAILED;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $p6 = $this->currPos;
  for (;;) {
    $r7 = self::charAt($this->input, $this->currPos);
    if ($r7 !== '' && !($r7 === "'")) {
      $this->currPos += strlen($r7);
    } else {
      $r7 = self::$FAILED;
      if (!$silence) {$this->fail(29);}
      break;
    }
  }
  // free $r7
  $r5 = true;
  // contents <- $r5
  if ($r5!==self::$FAILED) {
    $r5 = substr($this->input, $p6, $this->currPos - $p6);
  } else {
    $r5 = self::$FAILED;
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  // free $p6
  if (($this->input[$this->currPos] ?? null) === "'") {
    $this->currPos++;
    $r7 = "'";
  } else {
    if (!$silence) {$this->fail(28);}
    $r7 = self::$FAILED;
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a50($r5);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsedouble_quoted_part($silence, $boolParams) {
  $key = json_encode([162,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  if (($this->input[$this->currPos] ?? null) === "\"") {
    $this->currPos++;
    $r4 = "\"";
  } else {
    if (!$silence) {$this->fail(30);}
    $r4 = self::$FAILED;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = [];
  for (;;) {
    // start choice_1
    $r6 = $this->parsedquoted_escape($silence);
    if ($r6!==self::$FAILED) {
      goto choice_1;
    }
    $r6 = $this->parsebackquote_expansion($silence, $boolParams);
    if ($r6!==self::$FAILED) {
      goto choice_1;
    }
    $r6 = $this->parsedollar_expansion($silence, $boolParams);
    if ($r6!==self::$FAILED) {
      goto choice_1;
    }
    if (($this->input[$this->currPos] ?? null) === "\\") {
      $this->currPos++;
      $r6 = "\\";
      goto choice_1;
    } else {
      if (!$silence) {$this->fail(31);}
      $r6 = self::$FAILED;
    }
    $p7 = $this->currPos;
    $r6 = self::$FAILED;
    for (;;) {
      if (strcspn($this->input, "\"`\$\\", $this->currPos, 1) !== 0) {
        $r8 = self::consumeChar($this->input, $this->currPos);
        $r6 = true;
      } else {
        $r8 = self::$FAILED;
        if (!$silence) {$this->fail(32);}
        break;
      }
    }
    if ($r6!==self::$FAILED) {
      $r6 = substr($this->input, $p7, $this->currPos - $p7);
    } else {
      $r6 = self::$FAILED;
    }
    // free $r8
    // free $p7
    choice_1:
    if ($r6!==self::$FAILED) {
      $r5[] = $r6;
    } else {
      break;
    }
  }
  // contents <- $r5
  // free $r6
  if (($this->input[$this->currPos] ?? null) === "\"") {
    $this->currPos++;
    $r6 = "\"";
  } else {
    if (!$silence) {$this->fail(30);}
    $r6 = self::$FAILED;
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a51($r5);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsebare_escape_sequence($silence) {
  $key = json_encode([166,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  if (($this->input[$this->currPos] ?? null) === "\\") {
    $this->currPos++;
    $r4 = "\\";
  } else {
    if (!$silence) {$this->fail(31);}
    $r4 = self::$FAILED;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = self::charAt($this->input, $this->currPos);
  // contents <- $r5
  if ($r5 !== '' && !($r5 === "\x0a")) {
    $this->currPos += strlen($r5);
  } else {
    $r5 = self::$FAILED;
    if (!$silence) {$this->fail(4);}
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a52($r5);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsebackquote_expansion($silence, $boolParams) {
  $key = json_encode([168,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  if (($this->input[$this->currPos] ?? null) === "`") {
    $this->currPos++;
    $r4 = "`";
  } else {
    if (!$silence) {$this->fail(33);}
    $r4 = self::$FAILED;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = [];
  for (;;) {
    // start choice_1
    $r6 = $this->parsebackquoted_escape($silence);
    if ($r6!==self::$FAILED) {
      goto choice_1;
    }
    $r6 = $this->parsedollar_expansion($silence, $boolParams);
    if ($r6!==self::$FAILED) {
      goto choice_1;
    }
    $r6 = $this->parsedouble_backquote_expansion($silence, $boolParams);
    if ($r6!==self::$FAILED) {
      goto choice_1;
    }
    if (($this->input[$this->currPos] ?? null) === "\$") {
      $this->currPos++;
      $r6 = "\$";
      goto choice_1;
    } else {
      if (!$silence) {$this->fail(34);}
      $r6 = self::$FAILED;
    }
    if (($this->input[$this->currPos] ?? null) === "\\") {
      $this->currPos++;
      $r6 = "\\";
      goto choice_1;
    } else {
      if (!$silence) {$this->fail(31);}
      $r6 = self::$FAILED;
    }
    $p7 = $this->currPos;
    $r6 = self::$FAILED;
    for (;;) {
      if (strcspn($this->input, "`\$\\", $this->currPos, 1) !== 0) {
        $r8 = self::consumeChar($this->input, $this->currPos);
        $r6 = true;
      } else {
        $r8 = self::$FAILED;
        if (!$silence) {$this->fail(35);}
        break;
      }
    }
    if ($r6!==self::$FAILED) {
      $r6 = substr($this->input, $p7, $this->currPos - $p7);
    } else {
      $r6 = self::$FAILED;
    }
    // free $r8
    // free $p7
    choice_1:
    if ($r6!==self::$FAILED) {
      $r5[] = $r6;
    } else {
      break;
    }
  }
  // parts <- $r5
  // free $r6
  if (($this->input[$this->currPos] ?? null) === "`") {
    $this->currPos++;
    $r6 = "`";
  } else {
    if (!$silence) {$this->fail(33);}
    $r6 = self::$FAILED;
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a53($r5);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsedollar_expansion($silence, $boolParams) {
  $key = json_encode([174,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  if (($this->input[$this->currPos] ?? null) === "\$") {
    $this->currPos++;
    $r4 = "\$";
  } else {
    if (!$silence) {$this->fail(34);}
    $r4 = self::$FAILED;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  // start choice_1
  $r5 = $this->parsespecial_parameter($silence);
  if ($r5!==self::$FAILED) {
    goto choice_1;
  }
  $r5 = $this->parseshort_positional_parameter($silence);
  if ($r5!==self::$FAILED) {
    goto choice_1;
  }
  $r5 = $this->parsebrace_expansion($silence);
  if ($r5!==self::$FAILED) {
    goto choice_1;
  }
  $r5 = $this->parsearithmetic_expansion($silence, $boolParams);
  if ($r5!==self::$FAILED) {
    goto choice_1;
  }
  $r5 = $this->parsecommand_expansion($silence, $boolParams);
  if ($r5!==self::$FAILED) {
    goto choice_1;
  }
  $r5 = $this->parsenamed_parameter($silence);
  choice_1:
  // contents <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a54($r5);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parseplain_part($silence, $boolParams) {
  $key = json_encode([198,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start choice_1
  $p4 = $this->currPos;
  // start seq_1
  $p5 = $this->currPos;
  if (/*no_rbrace*/($boolParams & 0x1) !== 0) {
    $r6 = false;
  } else {
    $r6 = self::$FAILED;
    $r3 = self::$FAILED;
    goto seq_1;
  }
  $r7 = self::$FAILED;
  for (;;) {
    if (strcspn($this->input, "'\"\\`\$ \x09\x0b\x0d\x0c\x0a&|;<>(){}", $this->currPos, 1) !== 0) {
      $r8 = self::consumeChar($this->input, $this->currPos);
      $r7 = true;
    } else {
      $r8 = self::$FAILED;
      if (!$silence) {$this->fail(36);}
      break;
    }
  }
  if ($r7===self::$FAILED) {
    $this->currPos = $p5;
    $r3 = self::$FAILED;
    goto seq_1;
  }
  // free $r8
  $r3 = true;
  seq_1:
  if ($r3!==self::$FAILED) {
    $r3 = substr($this->input, $p4, $this->currPos - $p4);
    goto choice_1;
  } else {
    $r3 = self::$FAILED;
  }
  // free $p5
  // free $p4
  $p4 = $this->currPos;
  // start seq_2
  $p5 = $this->currPos;
  if (!(/*no_rbrace*/($boolParams & 0x1) !== 0)) {
    $r8 = false;
  } else {
    $r8 = self::$FAILED;
    $r3 = self::$FAILED;
    goto seq_2;
  }
  $r9 = self::$FAILED;
  for (;;) {
    if (strcspn($this->input, "'\"\\`\$ \x09\x0b\x0d\x0c\x0a&|;<>()", $this->currPos, 1) !== 0) {
      $r10 = self::consumeChar($this->input, $this->currPos);
      $r9 = true;
    } else {
      $r10 = self::$FAILED;
      if (!$silence) {$this->fail(37);}
      break;
    }
  }
  if ($r9===self::$FAILED) {
    $this->currPos = $p5;
    $r3 = self::$FAILED;
    goto seq_2;
  }
  // free $r10
  $r3 = true;
  seq_2:
  if ($r3!==self::$FAILED) {
    $r3 = substr($this->input, $p4, $this->currPos - $p4);
  } else {
    $r3 = self::$FAILED;
  }
  // free $p5
  // free $p4
  choice_1:
  // plain <- $r3
  $r1 = $r3;
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a55($r3);
  }
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function discardElse($silence) {
  $key = json_encode([109,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "else", $this->currPos, 4, false) === 0) {
    $r3 = "else";
    $this->currPos += 4;
  } else {
    if (!$silence) {$this->fail(38);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardDELIM($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function discardElif($silence) {
  $key = json_encode([111,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "elif", $this->currPos, 4, false) === 0) {
    $r3 = "elif";
    $this->currPos += 4;
  } else {
    if (!$silence) {$this->fail(39);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardDELIM($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function discardDo($silence) {
  $key = json_encode([115,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "do", $this->currPos, 2, false) === 0) {
    $r3 = "do";
    $this->currPos += 2;
  } else {
    if (!$silence) {$this->fail(40);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardDELIM($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function discardDone($silence) {
  $key = json_encode([117,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "done", $this->currPos, 4, false) === 0) {
    $r3 = "done";
    $this->currPos += 4;
  } else {
    if (!$silence) {$this->fail(41);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardDELIM($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function discardBang($silence) {
  $key = json_encode([133,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if (($this->input[$this->currPos] ?? null) === "!") {
    $this->currPos++;
    $r3 = "!";
  } else {
    if (!$silence) {$this->fail(9);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardDELIM($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function discardIn($silence) {
  $key = json_encode([135,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "in", $this->currPos, 2, false) === 0) {
    $r3 = "in";
    $this->currPos += 2;
  } else {
    if (!$silence) {$this->fail(42);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardDELIM($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function discardDELIM($silence) {
  $key = json_encode([155,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start choice_1
  $r1 = self::$FAILED;
  for (;;) {
    if (strspn($this->input, " \x09\x0b\x0d\x0c", $this->currPos, 1) !== 0) {
      $r2 = $this->input[$this->currPos++];
      $r1 = true;
    } else {
      $r2 = self::$FAILED;
      if (!$silence) {$this->fail(2);}
      break;
    }
  }
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  // free $r2
  $p3 = $this->currPos;
  if ($this->currPos < $this->inputLength) {
    $r1 = self::consumeChar($this->input, $this->currPos);;
  } else {
    $r1 = self::$FAILED;
  }
  if ($r1 === self::$FAILED) {
    $r1 = false;
    goto choice_1;
  } else {
    $r1 = self::$FAILED;
    $this->currPos = $p3;
  }
  // free $p3
  $p3 = $this->currPos;
  if (($this->input[$this->currPos] ?? null) === "\x0a") {
    $this->currPos++;
    $r1 = "\x0a";
    $r1 = false;
    $this->currPos = $p3;
  } else {
    $r1 = self::$FAILED;
  }
  // free $p3
  choice_1:
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function discardseparator($silence) {
  $key = json_encode([81,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start choice_1
  // start seq_1
  $p2 = $this->currPos;
  $r3 = $this->discardseparator_op($silence);
  if ($r3===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardlinebreak($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p2;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  // free $p2
  $r1 = $this->discardnewline_list($silence);
  choice_1:
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsecase_item($silence, $boolParams) {
  $key = json_encode([36,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start choice_1
  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->discardLPAREN($silence);
  if ($r4===self::$FAILED) {
    $r4 = null;
  }
  $r5 = $this->parsepattern($silence, $boolParams);
  // pattern <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r6 = $this->discardRPAREN($silence);
  if ($r6===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r7 = $this->parsecompound_list($silence, $boolParams);
  // list <- $r7
  if ($r7===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r8 = $this->discardDSEMI($silence);
  if ($r8===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r9 = $this->discardlinebreak($silence);
  if ($r9===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a56($r5, $r7);
    goto choice_1;
  }
  // free $p3
  $p3 = $this->currPos;
  // start seq_2
  $p10 = $this->currPos;
  $r11 = $this->discardLPAREN($silence);
  if ($r11===self::$FAILED) {
    $r11 = null;
  }
  $r12 = $this->parsepattern($silence, $boolParams);
  // pattern <- $r12
  if ($r12===self::$FAILED) {
    $this->currPos = $p10;
    $r1 = self::$FAILED;
    goto seq_2;
  }
  $r13 = $this->discardRPAREN($silence);
  if ($r13===self::$FAILED) {
    $this->currPos = $p10;
    $r1 = self::$FAILED;
    goto seq_2;
  }
  $r14 = $this->discardlinebreak($silence);
  if ($r14===self::$FAILED) {
    $this->currPos = $p10;
    $r1 = self::$FAILED;
    goto seq_2;
  }
  $r15 = $this->discardDSEMI($silence);
  if ($r15===self::$FAILED) {
    $this->currPos = $p10;
    $r1 = self::$FAILED;
    goto seq_2;
  }
  $r16 = $this->discardlinebreak($silence);
  if ($r16===self::$FAILED) {
    $this->currPos = $p10;
    $r1 = self::$FAILED;
    goto seq_2;
  }
  $r1 = true;
  seq_2:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p3;
    $r1 = $this->a57($r12);
  }
  // free $p10
  choice_1:
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsecase_item_ns($silence, $boolParams) {
  $key = json_encode([34,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start choice_1
  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->discardLPAREN($silence);
  if ($r4===self::$FAILED) {
    $r4 = null;
  }
  $r5 = $this->parsepattern($silence, $boolParams);
  // pattern <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r6 = $this->discardRPAREN($silence);
  if ($r6===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r7 = $this->parsecompound_list($silence, $boolParams);
  // list <- $r7
  if ($r7===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a56($r5, $r7);
    goto choice_1;
  }
  // free $p3
  $p3 = $this->currPos;
  // start seq_2
  $p8 = $this->currPos;
  $r9 = $this->discardLPAREN($silence);
  if ($r9===self::$FAILED) {
    $r9 = null;
  }
  $r10 = $this->parsepattern($silence, $boolParams);
  // pattern <- $r10
  if ($r10===self::$FAILED) {
    $this->currPos = $p8;
    $r1 = self::$FAILED;
    goto seq_2;
  }
  $r11 = $this->discardRPAREN($silence);
  if ($r11===self::$FAILED) {
    $this->currPos = $p8;
    $r1 = self::$FAILED;
    goto seq_2;
  }
  $r12 = $this->discardlinebreak($silence);
  if ($r12===self::$FAILED) {
    $this->currPos = $p8;
    $r1 = self::$FAILED;
    goto seq_2;
  }
  $r1 = true;
  seq_2:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p3;
    $r1 = $this->a58($r10);
  }
  // free $p8
  choice_1:
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function discardLESSAND($silence) {
  $key = json_encode([95,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "<&", $this->currPos, 2, false) === 0) {
    $r3 = "<&";
    $this->currPos += 2;
  } else {
    if (!$silence) {$this->fail(43);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardOWS($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function discardLESSGREAT($silence) {
  $key = json_encode([99,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "<>", $this->currPos, 2, false) === 0) {
    $r3 = "<>";
    $this->currPos += 2;
  } else {
    if (!$silence) {$this->fail(44);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardOWS($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function discardLESS($silence) {
  $key = json_encode([143,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  $p3 = $this->currPos;
  $r4 = $this->discardDLESS(true);
  if ($r4 === self::$FAILED) {
    $r4 = false;
  } else {
    $r4 = self::$FAILED;
    $this->currPos = $p3;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  // free $p3
  $p3 = $this->currPos;
  $r5 = $this->discardLESSAND(true);
  if ($r5 === self::$FAILED) {
    $r5 = false;
  } else {
    $r5 = self::$FAILED;
    $this->currPos = $p3;
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  // free $p3
  $p3 = $this->currPos;
  $r6 = $this->discardLESSGREAT(true);
  if ($r6 === self::$FAILED) {
    $r6 = false;
  } else {
    $r6 = self::$FAILED;
    $this->currPos = $p3;
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  // free $p3
  $p3 = $this->currPos;
  $r7 = $this->discardDLESSDASH(true);
  if ($r7 === self::$FAILED) {
    $r7 = false;
  } else {
    $r7 = self::$FAILED;
    $this->currPos = $p3;
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  // free $p3
  if (($this->input[$this->currPos] ?? null) === "<") {
    $this->currPos++;
    $r8 = "<";
  } else {
    if (!$silence) {$this->fail(45);}
    $r8 = self::$FAILED;
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r9 = $this->discardOWS($silence);
  if ($r9===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function discardGREATAND($silence) {
  $key = json_encode([97,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, ">&", $this->currPos, 2, false) === 0) {
    $r3 = ">&";
    $this->currPos += 2;
  } else {
    if (!$silence) {$this->fail(46);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardOWS($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function discardDGREAT($silence) {
  $key = json_encode([93,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, ">>", $this->currPos, 2, false) === 0) {
    $r3 = ">>";
    $this->currPos += 2;
  } else {
    if (!$silence) {$this->fail(47);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardOWS($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function discardCLOBBER($silence) {
  $key = json_encode([103,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, ">|", $this->currPos, 2, false) === 0) {
    $r3 = ">|";
    $this->currPos += 2;
  } else {
    if (!$silence) {$this->fail(48);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardOWS($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function discardGREAT($silence) {
  $key = json_encode([145,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  $p3 = $this->currPos;
  $r4 = $this->discardDGREAT(true);
  if ($r4 === self::$FAILED) {
    $r4 = false;
  } else {
    $r4 = self::$FAILED;
    $this->currPos = $p3;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  // free $p3
  $p3 = $this->currPos;
  $r5 = $this->discardGREATAND(true);
  if ($r5 === self::$FAILED) {
    $r5 = false;
  } else {
    $r5 = self::$FAILED;
    $this->currPos = $p3;
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  // free $p3
  $p3 = $this->currPos;
  $r6 = $this->discardCLOBBER(true);
  if ($r6 === self::$FAILED) {
    $r6 = false;
  } else {
    $r6 = self::$FAILED;
    $this->currPos = $p3;
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  // free $p3
  if (($this->input[$this->currPos] ?? null) === ">") {
    $this->currPos++;
    $r7 = ">";
  } else {
    if (!$silence) {$this->fail(49);}
    $r7 = self::$FAILED;
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r8 = $this->discardOWS($silence);
  if ($r8===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function discardDLESSDASH($silence) {
  $key = json_encode([101,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "<<-", $this->currPos, 3, false) === 0) {
    $r3 = "<<-";
    $this->currPos += 3;
  } else {
    if (!$silence) {$this->fail(50);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardOWS($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function discardDLESS($silence) {
  $key = json_encode([91,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "<<", $this->currPos, 2, false) === 0) {
    $r3 = "<<";
    $this->currPos += 2;
  } else {
    if (!$silence) {$this->fail(51);}
    $r3 = self::$FAILED;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r4 = $this->discardOWS($silence);
  if ($r4===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = true;
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function parsehere_end($silence, $boolParams) {
  $key = json_encode([72,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p1 = $this->currPos;
  $r2 = $this->discardWORD($silence, $boolParams);
  if ($r2!==self::$FAILED) {
    $r2 = substr($this->input, $p1, $this->currPos - $p1);
  } else {
    $r2 = self::$FAILED;
  }
  // free $p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function parsedquoted_escape($silence) {
  $key = json_encode([164,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  if (($this->input[$this->currPos] ?? null) === "\\") {
    $this->currPos++;
    $r4 = "\\";
  } else {
    if (!$silence) {$this->fail(31);}
    $r4 = self::$FAILED;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  // contents <- $r5
  if (strspn($this->input, "\$`\"\\\x0a", $this->currPos, 1) !== 0) {
    $r5 = $this->input[$this->currPos++];
  } else {
    $r5 = self::$FAILED;
    if (!$silence) {$this->fail(52);}
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a59($r5);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsebackquoted_escape($silence) {
  $key = json_encode([170,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  if (($this->input[$this->currPos] ?? null) === "\\") {
    $this->currPos++;
    $r4 = "\\";
  } else {
    if (!$silence) {$this->fail(31);}
    $r4 = self::$FAILED;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = $this->input[$this->currPos] ?? '';
  // contents <- $r5
  if ($r5 === "\$" || $r5 === "\\") {
    $this->currPos++;
  } else {
    $r5 = self::$FAILED;
    if (!$silence) {$this->fail(53);}
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a60($r5);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsedouble_backquote_expansion($silence, $boolParams) {
  $key = json_encode([172,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "\\`", $this->currPos, 2, false) === 0) {
    $r4 = "\\`";
    $this->currPos += 2;
  } else {
    if (!$silence) {$this->fail(54);}
    $r4 = self::$FAILED;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  // start choice_1
  $r5 = $this->parsebackquoted_escape($silence);
  if ($r5!==self::$FAILED) {
    goto choice_1;
  }
  $r5 = $this->parsedollar_expansion($silence, $boolParams);
  if ($r5!==self::$FAILED) {
    goto choice_1;
  }
  if (($this->input[$this->currPos] ?? null) === "\$") {
    $this->currPos++;
    $r5 = "\$";
    goto choice_1;
  } else {
    if (!$silence) {$this->fail(34);}
    $r5 = self::$FAILED;
  }
  // start seq_2
  $p6 = $this->currPos;
  if (($this->input[$this->currPos] ?? null) === "\\") {
    $this->currPos++;
    $r7 = "\\";
  } else {
    if (!$silence) {$this->fail(31);}
    $r7 = self::$FAILED;
    $r5 = self::$FAILED;
    goto seq_2;
  }
  $p8 = $this->currPos;
  if (($this->input[$this->currPos] ?? null) === "`") {
    $this->currPos++;
    $r9 = "`";
  } else {
    $r9 = self::$FAILED;
  }
  if ($r9 === self::$FAILED) {
    $r9 = false;
  } else {
    $r9 = self::$FAILED;
    $this->currPos = $p8;
    $this->currPos = $p6;
    $r5 = self::$FAILED;
    goto seq_2;
  }
  // free $p8
  $r5 = [$r7,$r9];
  seq_2:
  if ($r5!==self::$FAILED) {
    goto choice_1;
  }
  // free $p6
  $p6 = $this->currPos;
  $r5 = self::$FAILED;
  for (;;) {
    if (strcspn($this->input, "`\$\\", $this->currPos, 1) !== 0) {
      $r10 = self::consumeChar($this->input, $this->currPos);
      $r5 = true;
    } else {
      $r10 = self::$FAILED;
      if (!$silence) {$this->fail(35);}
      break;
    }
  }
  if ($r5!==self::$FAILED) {
    $r5 = substr($this->input, $p6, $this->currPos - $p6);
  } else {
    $r5 = self::$FAILED;
  }
  // free $r10
  // free $p6
  choice_1:
  // parts <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "\\`", $this->currPos, 2, false) === 0) {
    $r10 = "\\`";
    $this->currPos += 2;
  } else {
    if (!$silence) {$this->fail(54);}
    $r10 = self::$FAILED;
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a61($r5);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsespecial_parameter($silence) {
  $key = json_encode([176,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // contents <- $r3
  if (strspn($this->input, "@*#?-\$!0", $this->currPos, 1) !== 0) {
    $r3 = $this->input[$this->currPos++];
  } else {
    $r3 = self::$FAILED;
    if (!$silence) {$this->fail(55);}
  }
  $r1 = $r3;
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a62($r3);
  }
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parseshort_positional_parameter($silence) {
  $key = json_encode([178,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  $r3 = $this->input[$this->currPos] ?? '';
  // contents <- $r3
  if (preg_match("/^[1-9]/", $r3)) {
    $this->currPos++;
  } else {
    $r3 = self::$FAILED;
    if (!$silence) {$this->fail(56);}
  }
  $r1 = $r3;
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a63($r3);
  }
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsebrace_expansion($silence) {
  $key = json_encode([180,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  if (($this->input[$this->currPos] ?? null) === "{") {
    $this->currPos++;
    $r4 = "{";
  } else {
    if (!$silence) {$this->fail(17);}
    $r4 = self::$FAILED;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  // start choice_1
  $r5 = $this->parsebinary_expansion($silence);
  if ($r5!==self::$FAILED) {
    goto choice_1;
  }
  $r5 = $this->parsestring_length($silence);
  if ($r5!==self::$FAILED) {
    goto choice_1;
  }
  $r5 = $this->parsebraced_parameter_expansion($silence);
  choice_1:
  // contents <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  if (($this->input[$this->currPos] ?? null) === "}") {
    $this->currPos++;
    $r6 = "}";
  } else {
    if (!$silence) {$this->fail(18);}
    $r6 = self::$FAILED;
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a54($r5);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsearithmetic_expansion($silence, $boolParams) {
  $key = json_encode([186,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "((", $this->currPos, 2, false) === 0) {
    $r4 = "((";
    $this->currPos += 2;
  } else {
    if (!$silence) {$this->fail(57);}
    $r4 = self::$FAILED;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = $this->discardOWS($silence);
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r6 = [];
  for (;;) {
    $r7 = $this->parseWORD($silence, $boolParams);
    if ($r7!==self::$FAILED) {
      $r6[] = $r7;
    } else {
      break;
    }
  }
  if (count($r6) === 0) {
    $r6 = self::$FAILED;
  }
  // words <- $r6
  if ($r6===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  // free $r7
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "))", $this->currPos, 2, false) === 0) {
    $r7 = "))";
    $this->currPos += 2;
  } else {
    if (!$silence) {$this->fail(58);}
    $r7 = self::$FAILED;
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a64($r6);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsecommand_expansion($silence, $boolParams) {
  $key = json_encode([188,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  if (($this->input[$this->currPos] ?? null) === "(") {
    $this->currPos++;
    $r4 = "(";
  } else {
    if (!$silence) {$this->fail(14);}
    $r4 = self::$FAILED;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = $this->parsecomplete_command($silence, $boolParams);
  // command <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  if (($this->input[$this->currPos] ?? null) === ")") {
    $this->currPos++;
    $r6 = ")";
  } else {
    if (!$silence) {$this->fail(15);}
    $r6 = self::$FAILED;
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a65($r5);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsenamed_parameter($silence) {
  $key = json_encode([196,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  $r3 = $this->parseNAME($silence);
  // name <- $r3
  $r1 = $r3;
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a66($r3);
  }
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsepattern($silence, $boolParams) {
  $key = json_encode([38,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->parseWORD($silence, $boolParams);
  // first <- $r4
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = [];
  for (;;) {
    // start seq_2
    $p7 = $this->currPos;
    $r8 = $this->parsePIPE($silence);
    if ($r8===self::$FAILED) {
      $r6 = self::$FAILED;
      goto seq_2;
    }
    $r9 = $this->parseWORD($silence, $boolParams);
    if ($r9===self::$FAILED) {
      $this->currPos = $p7;
      $r6 = self::$FAILED;
      goto seq_2;
    }
    $r6 = [$r8,$r9];
    seq_2:
    if ($r6!==self::$FAILED) {
      $r5[] = $r6;
    } else {
      break;
    }
    // free $p7
  }
  // rest <- $r5
  // free $r6
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a67($r4, $r5);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function discardWORD($silence, $boolParams) {
  $key = json_encode([157,$this->currPos,$boolParams & 0x1]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = [];
  for (;;) {
    $r5 = $this->parseword_part($silence, $boolParams);
    if ($r5!==self::$FAILED) {
      $r4[] = $r5;
    } else {
      break;
    }
  }
  if (count($r4) === 0) {
    $r4 = self::$FAILED;
  }
  // parts <- $r4
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  // free $r5
  $r5 = $this->discardOWS($silence);
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a19($r4);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsebinary_expansion($silence) {
  $key = json_encode([182,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  $r4 = $this->parseparameter($silence);
  // parameter <- $r4
  if ($r4===self::$FAILED) {
    $r1 = self::$FAILED;
    goto seq_1;
  }
  // start choice_1
  $p6 = $this->currPos;
  // start seq_2
  $p7 = $this->currPos;
  if (($this->input[$this->currPos] ?? null) === ":") {
    $this->currPos++;
    $r8 = ":";
  } else {
    if (!$silence) {$this->fail(59);}
    $r8 = self::$FAILED;
    $r5 = self::$FAILED;
    goto seq_2;
  }
  if (strspn($this->input, "-=?+", $this->currPos, 1) !== 0) {
    $r9 = $this->input[$this->currPos++];
  } else {
    $r9 = self::$FAILED;
    if (!$silence) {$this->fail(60);}
    $this->currPos = $p7;
    $r5 = self::$FAILED;
    goto seq_2;
  }
  $r5 = true;
  seq_2:
  if ($r5!==self::$FAILED) {
    $r5 = substr($this->input, $p6, $this->currPos - $p6);
    goto choice_1;
  } else {
    $r5 = self::$FAILED;
  }
  // free $p7
  // free $p6
  $p6 = $this->currPos;
  // start choice_2
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "%%", $this->currPos, 2, false) === 0) {
    $r5 = "%%";
    $this->currPos += 2;
    goto choice_2;
  } else {
    if (!$silence) {$this->fail(61);}
    $r5 = self::$FAILED;
  }
  if ($this->currPos >= $this->inputLength ? false : substr_compare($this->input, "##", $this->currPos, 2, false) === 0) {
    $r5 = "##";
    $this->currPos += 2;
    goto choice_2;
  } else {
    if (!$silence) {$this->fail(62);}
    $r5 = self::$FAILED;
  }
  if (strspn($this->input, "%#-=?+", $this->currPos, 1) !== 0) {
    $r5 = $this->input[$this->currPos++];
  } else {
    $r5 = self::$FAILED;
    if (!$silence) {$this->fail(63);}
  }
  choice_2:
  if ($r5!==self::$FAILED) {
    $r5 = substr($this->input, $p6, $this->currPos - $p6);
  } else {
    $r5 = self::$FAILED;
  }
  // free $p6
  choice_1:
  // operator <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r10 = $this->discardOWS($silence);
  if ($r10===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r11 = $this->parseWORD($silence, 0x1);
  if ($r11===self::$FAILED) {
    $r11 = null;
  }
  // word <- $r11
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a68($r4, $r5, $r11);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsestring_length($silence) {
  $key = json_encode([184,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  // start seq_1
  $p3 = $this->currPos;
  if (($this->input[$this->currPos] ?? null) === "#") {
    $this->currPos++;
    $r4 = "#";
  } else {
    if (!$silence) {$this->fail(3);}
    $r4 = self::$FAILED;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r5 = $this->parseparameter($silence);
  // parameter <- $r5
  if ($r5===self::$FAILED) {
    $this->currPos = $p3;
    $r1 = self::$FAILED;
    goto seq_1;
  }
  $r1 = true;
  seq_1:
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a69($r5);
  }
  // free $p3
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsebraced_parameter_expansion($silence) {
  $key = json_encode([190,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  $r3 = $this->parseparameter($silence);
  // parameter <- $r3
  $r1 = $r3;
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a70($r3);
  }
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parsePIPE($silence) {
  $key = json_encode([146,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  $p3 = $this->currPos;
  $r4 = $this->discardOR_IF(true);
  if ($r4 === self::$FAILED) {
    $r4 = false;
  } else {
    $r4 = self::$FAILED;
    $this->currPos = $p3;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  // free $p3
  if (($this->input[$this->currPos] ?? null) === "|") {
    $this->currPos++;
    $r5 = "|";
  } else {
    if (!$silence) {$this->fail(11);}
    $r5 = self::$FAILED;
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r6 = $this->parseOWS($silence);
  if ($r6===self::$FAILED) {
    $this->currPos = $p1;
    $r2 = self::$FAILED;
    goto seq_1;
  }
  $r2 = [$r4,$r5,$r6];
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function parseparameter($silence) {
  $key = json_encode([192,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start choice_1
  $r1 = $this->parsespecial_parameter($silence);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->parselong_positional_parameter($silence);
  if ($r1!==self::$FAILED) {
    goto choice_1;
  }
  $r1 = $this->parsenamed_parameter($silence);
  choice_1:
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}
private function parseOWS($silence) {
  $key = json_encode([152,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  // start seq_1
  $p1 = $this->currPos;
  $r3 = [];
  for (;;) {
    if (strspn($this->input, " \x09\x0b\x0d\x0c", $this->currPos, 1) !== 0) {
      $r4 = $this->input[$this->currPos++];
      $r3[] = $r4;
    } else {
      $r4 = self::$FAILED;
      if (!$silence) {$this->fail(2);}
      break;
    }
  }
  // free $r4
  // start seq_2
  $p5 = $this->currPos;
  if (($this->input[$this->currPos] ?? null) === "#") {
    $this->currPos++;
    $r6 = "#";
  } else {
    if (!$silence) {$this->fail(3);}
    $r6 = self::$FAILED;
    $r4 = self::$FAILED;
    goto seq_2;
  }
  $r7 = [];
  for (;;) {
    $r8 = self::charAt($this->input, $this->currPos);
    if ($r8 !== '' && !($r8 === "\x0a")) {
      $this->currPos += strlen($r8);
      $r7[] = $r8;
    } else {
      $r8 = self::$FAILED;
      if (!$silence) {$this->fail(4);}
      break;
    }
  }
  // free $r8
  $r4 = [$r6,$r7];
  seq_2:
  if ($r4===self::$FAILED) {
    $r4 = null;
  }
  // free $p5
  $r2 = [$r3,$r4];
  seq_1:
  // free $r2,$p1
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r2

  );
  return $r2;
}
private function parselong_positional_parameter($silence) {
  $key = json_encode([194,$this->currPos]);
  $cached = $this->cache[$key] ?? null;
  if ($cached) {
    $this->currPos = $cached->nextPos;

    return $cached->result;
  }

  $p2 = $this->currPos;
  $p4 = $this->currPos;
  $r3 = self::$FAILED;
  for (;;) {
    $r5 = $this->input[$this->currPos] ?? '';
    if (preg_match("/^[0-9]/", $r5)) {
      $this->currPos++;
      $r3 = true;
    } else {
      $r5 = self::$FAILED;
      if (!$silence) {$this->fail(27);}
      break;
    }
  }
  // parameter <- $r3
  if ($r3!==self::$FAILED) {
    $r3 = substr($this->input, $p4, $this->currPos - $p4);
  } else {
    $r3 = self::$FAILED;
  }
  // free $r5
  // free $p4
  $r1 = $r3;
  if ($r1!==self::$FAILED) {
    $this->savedPos = $p2;
    $r1 = $this->a71($r3);
  }
  $this->cache[$key] = new PEGParserCacheEntry(
    $this->currPos,
    $r1

  );
  return $r1;
}

	public function parse( $input, $options = [] ) {
		$this->initInternal( $input, $options );
		$startRule = $options['startRule'] ?? '(DEFAULT)';
		$result = null;

		if ( !empty( $options['stream'] ) ) {
			switch ( $startRule ) {
				
			default:
				throw new \Wikimedia\WikiPEG\InternalError( "Can't stream rule $startRule." );
			}
		} else {
			switch ( $startRule ) {
				case '(DEFAULT)':
case "program":
  $result = $this->parseprogram(false);
  break;
			default:
				throw new \Wikimedia\WikiPEG\InternalError( "Can't start parsing from rule $startRule." );
			}
		}

		if ( $result !== self::$FAILED && $this->currPos === $this->inputLength ) {
			return $result;
		} else {
			if ( $result !== self::$FAILED && $this->currPos < $this->inputLength ) {
				$this->fail( 0 );
			}
			throw $this->buildParseException();
		}
	}
}

