// AUTOGENERATED FILE
// This file was generated from pep-508.ohm by `ohm generateBundles`.

import {
  BaseActionDict,
  Grammar,
  IterationNode,
  Node,
  NonterminalNode,
  Semantics,
  TerminalNode
} from 'ohm-js';

export interface PEP508ActionDict<T> extends BaseActionDict<T> {
  File?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  Line?: (this: NonterminalNode, arg0: IterationNode, arg1: IterationNode) => T;
  Req?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  NameReq?: (this: NonterminalNode, arg0: NonterminalNode, arg1: IterationNode, arg2: NonterminalNode, arg3: IterationNode) => T;
  UrlReq?: (this: NonterminalNode, arg0: NonterminalNode, arg1: IterationNode, arg2: NonterminalNode, arg3: IterationNode, arg4: IterationNode) => T;
  Extras?: (this: NonterminalNode, arg0: TerminalNode, arg1: NonterminalNode, arg2: TerminalNode) => T;
  Name?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  identifier?: (this: NonterminalNode, arg0: NonterminalNode, arg1: IterationNode) => T;
  identifierEnd_single?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  identifierEnd_multi?: (this: NonterminalNode, arg0: IterationNode, arg1: NonterminalNode) => T;
  identifierEnd?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  RequirementsReq?: (this: NonterminalNode, arg0: TerminalNode, arg1: NonterminalNode) => T;
  ConstraintsReq?: (this: NonterminalNode, arg0: TerminalNode, arg1: NonterminalNode) => T;
  filePath?: (this: NonterminalNode, arg0: IterationNode) => T;
  UrlSpec?: (this: NonterminalNode, arg0: TerminalNode, arg1: NonterminalNode) => T;
  uriReference?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  uri?: (this: NonterminalNode, arg0: NonterminalNode, arg1: TerminalNode, arg2: IterationNode, arg3: IterationNode, arg4: IterationNode, arg5: IterationNode, arg6: IterationNode) => T;
  hierPart_abempty?: (this: NonterminalNode, arg0: TerminalNode, arg1: NonterminalNode, arg2: NonterminalNode) => T;
  hierPart_absolute?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  hierPart_rootless?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  hierPart?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  absoluteUri?: (this: NonterminalNode, arg0: NonterminalNode, arg1: TerminalNode, arg2: IterationNode, arg3: IterationNode, arg4: IterationNode) => T;
  relativeRef?: (this: NonterminalNode, arg0: IterationNode, arg1: IterationNode, arg2: IterationNode, arg3: IterationNode, arg4: IterationNode) => T;
  relativePart_abempty?: (this: NonterminalNode, arg0: TerminalNode, arg1: NonterminalNode, arg2: NonterminalNode) => T;
  relativePart_absolute?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  relativePart_noscheme?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  relativePart?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  scheme?: (this: NonterminalNode, arg0: NonterminalNode, arg1: IterationNode) => T;
  authority?: (this: NonterminalNode, arg0: IterationNode, arg1: IterationNode, arg2: NonterminalNode, arg3: IterationNode, arg4: IterationNode) => T;
  userinfo?: (this: NonterminalNode, arg0: IterationNode) => T;
  host?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  port?: (this: NonterminalNode, arg0: IterationNode) => T;
  ipLiteral?: (this: NonterminalNode, arg0: TerminalNode, arg1: NonterminalNode, arg2: TerminalNode) => T;
  ipvFuture?: (this: NonterminalNode, arg0: TerminalNode, arg1: IterationNode, arg2: TerminalNode, arg3: IterationNode) => T;
  ipv6Address?: (this: NonterminalNode, arg0: IterationNode) => T;
  ipv4Address?: (this: NonterminalNode, arg0: NonterminalNode, arg1: TerminalNode, arg2: NonterminalNode, arg3: TerminalNode, arg4: NonterminalNode, arg5: TerminalNode, arg6: NonterminalNode) => T;
  nz?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  decOctet_zeroToNine?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  decOctet_tenToNinetyNine?: (this: NonterminalNode, arg0: NonterminalNode, arg1: NonterminalNode) => T;
  decOctet_oneHundredToOneNinetyNine?: (this: NonterminalNode, arg0: TerminalNode, arg1: NonterminalNode, arg2: NonterminalNode) => T;
  decOctet_twoHundredToTwoFortyNine?: (this: NonterminalNode, arg0: TerminalNode, arg1: TerminalNode, arg2: NonterminalNode) => T;
  decOctet_twoFiftyToTwoFiftyFive?: (this: NonterminalNode, arg0: TerminalNode, arg1: TerminalNode) => T;
  decOctet?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  regName?: (this: NonterminalNode, arg0: IterationNode) => T;
  path?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  pathAbempty?: (this: NonterminalNode, arg0: IterationNode, arg1: IterationNode) => T;
  pathAbsolute?: (this: NonterminalNode, arg0: TerminalNode, arg1: IterationNode, arg2: IterationNode, arg3: IterationNode) => T;
  pathNoscheme?: (this: NonterminalNode, arg0: NonterminalNode, arg1: IterationNode, arg2: IterationNode) => T;
  pathRootless?: (this: NonterminalNode, arg0: NonterminalNode, arg1: IterationNode, arg2: IterationNode) => T;
  segment?: (this: NonterminalNode, arg0: IterationNode) => T;
  segmentNz?: (this: NonterminalNode, arg0: IterationNode) => T;
  segmentNzNc?: (this: NonterminalNode, arg0: IterationNode) => T;
  pchar?: (this: NonterminalNode, arg0: NonterminalNode | TerminalNode) => T;
  query?: (this: NonterminalNode, arg0: IterationNode) => T;
  fragment?: (this: NonterminalNode, arg0: IterationNode) => T;
  pctEncoded?: (this: NonterminalNode, arg0: TerminalNode, arg1: NonterminalNode) => T;
  unreserved?: (this: NonterminalNode, arg0: NonterminalNode | TerminalNode) => T;
  reserved?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  genDelims?: (this: NonterminalNode, arg0: TerminalNode) => T;
  subDelims?: (this: NonterminalNode, arg0: TerminalNode) => T;
  hexdig?: (this: NonterminalNode, arg0: NonterminalNode | TerminalNode) => T;
  QuotedMarker?: (this: NonterminalNode, arg0: TerminalNode, arg1: NonterminalNode) => T;
  Marker?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  MarkerOr_node?: (this: NonterminalNode, arg0: NonterminalNode, arg1: TerminalNode, arg2: NonterminalNode) => T;
  MarkerOr_leaf?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  MarkerOr?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  MarkerAnd_node?: (this: NonterminalNode, arg0: NonterminalNode, arg1: TerminalNode, arg2: NonterminalNode) => T;
  MarkerAnd_leaf?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  MarkerAnd?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  MarkerExpr_leaf?: (this: NonterminalNode, arg0: NonterminalNode, arg1: NonterminalNode, arg2: NonterminalNode) => T;
  MarkerExpr_node?: (this: NonterminalNode, arg0: TerminalNode, arg1: NonterminalNode, arg2: TerminalNode) => T;
  MarkerExpr?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  MarkerVar?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  markerOp_versionCmp?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  markerOp_in?: (this: NonterminalNode, arg0: TerminalNode) => T;
  markerOp_notIn?: (this: NonterminalNode, arg0: TerminalNode, arg1: IterationNode, arg2: TerminalNode) => T;
  markerOp?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  pythonStr?: (this: NonterminalNode, arg0: TerminalNode, arg1: IterationNode, arg2: TerminalNode) => T;
  pythonStrChar?: (this: NonterminalNode, arg0: NonterminalNode | TerminalNode) => T;
  envVar?: (this: NonterminalNode, arg0: TerminalNode) => T;
  VersionSpec_parenthesized?: (this: NonterminalNode, arg0: TerminalNode, arg1: NonterminalNode, arg2: TerminalNode) => T;
  VersionSpec_direct?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  VersionSpec?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  VersionMany?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  VersionOne?: (this: NonterminalNode, arg0: NonterminalNode, arg1: NonterminalNode) => T;
  versionCmp?: (this: NonterminalNode, arg0: TerminalNode) => T;
  version?: (this: NonterminalNode, arg0: IterationNode) => T;
  comment?: (this: NonterminalNode, arg0: TerminalNode, arg1: IterationNode) => T;
  space?: (this: NonterminalNode, arg0: TerminalNode) => T;
  LooseFile?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  LooseLine?: (this: NonterminalNode, arg0: NonterminalNode, arg1: IterationNode) => T;
  LooseReq?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  LooseNameReq?: (this: NonterminalNode, arg0: NonterminalNode, arg1: IterationNode, arg2: NonterminalNode, arg3: IterationNode) => T;
  LooseNonNameReq?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  LooseExtras?: (this: NonterminalNode, arg0: TerminalNode, arg1: NonterminalNode, arg2: IterationNode, arg3: IterationNode) => T;
  LooseQuotedMarker?: (this: NonterminalNode, arg0: TerminalNode, arg1: NonterminalNode) => T;
  LooseVersionSpec_parenthesized?: (this: NonterminalNode, arg0: TerminalNode, arg1: NonterminalNode, arg2: IterationNode) => T;
  LooseVersionSpec_direct?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  LooseVersionSpec?: (this: NonterminalNode, arg0: NonterminalNode) => T;
  LooseVersionMany?: (this: NonterminalNode, arg0: NonterminalNode, arg1: IterationNode) => T;
  LooseVersionOne?: (this: NonterminalNode, arg0: NonterminalNode, arg1: IterationNode) => T;
  looseVersionCmp?: (this: NonterminalNode, arg0: IterationNode) => T;
  looseVersion?: (this: NonterminalNode, arg0: IterationNode) => T;
  looseAnything?: (this: NonterminalNode, arg0: IterationNode) => T;
}

export interface PEP508Semantics extends Semantics {
  addOperation<T>(name: string, actionDict: PEP508ActionDict<T>): this;
  extendOperation<T>(name: string, actionDict: PEP508ActionDict<T>): this;
  addAttribute<T>(name: string, actionDict: PEP508ActionDict<T>): this;
  extendAttribute<T>(name: string, actionDict: PEP508ActionDict<T>): this;
}

export interface PEP508Grammar extends Grammar {
  createSemantics(): PEP508Semantics;
  extendSemantics(superSemantics: PEP508Semantics): PEP508Semantics;
}

declare const grammar: PEP508Grammar;
export default grammar;

