text: #
  # ebnftest.py
  #
  # Test script for ebnf.py
  #
  # Submitted 2004 by Seo Sanghyeon
  #
  print('Importing pyparsing...')
  from pyparsing import *
  
  print('Constructing EBNF parser with pyparsing...')
  import ebnf
  
  
  grammar = '''
  syntax = (syntax_rule), {(syntax_rule)};
  syntax_rule = meta_identifier, '=', definitions_list, ';';
  definitions_list = single_definition, {'|', single_definition};
  single_definition = syntactic_term, {',', syntactic_term};
  syntactic_term = syntactic_factor,['-', syntactic_factor];
  syntactic_factor = [integer, '*'], syntactic_primary;
  syntactic_primary = optional_sequence | repeated_sequence |
    grouped_sequence | meta_identifier | terminal_string;
  optional_sequence = '[', definitions_list, ']';
  repeated_sequence = '{', definitions_list, '}';
  grouped_sequence = '(', definitions_list, ')';
  (*
  terminal_string = "'", character - "'", {character - "'"}, "'" |
    '"', character - '"', {character - '"'}, '"';
   meta_identifier = letter, {letter | digit};
  integer = digit, {digit};
  *)
  '''
  
  table = {}
  #~ table['character'] = Word(printables, exact=1)
  #~ table['letter'] = Word(alphas + '_', exact=1)
  #~ table['digit'] = Word(nums, exact=1)
  table['terminal_string'] = sglQuotedString
  table['meta_identifier'] = Word(alphas+"_", alphas+"_"+nums)
  table['integer'] = Word(nums)
  
  print('Parsing EBNF grammar with EBNF parser...')
  parsers = ebnf.parse(grammar, table)
  ebnf_parser = parsers['syntax']
  
  commentcharcount = 0
  commentlocs = set()
  def tallyCommentChars(s,l,t):
      global commentcharcount,commentlocs
      # only count this comment if we haven't seen it before
      if l not in commentlocs:
          charCount = ( len(t[0]) - len(list(filter(str.isspace, t[0]))) )
          commentcharcount += charCount
          commentlocs.add(l)
      return l,t
  
  #ordinarily, these lines wouldn't be necessary, but we are doing extra stuff with the comment expression
  ebnf.ebnfComment.setParseAction( tallyCommentChars )
  ebnf_parser.ignore( ebnf.ebnfComment )
  
  print('Parsing EBNF grammar with generated EBNF parser...\n')
  parsed_chars = ebnf_parser.parseString(grammar)
  parsed_char_len = len(parsed_chars)
  
  print("],\n".join(str( parsed_chars.asList() ).split("],")))
  
  #~ grammar_length = len(grammar) - len(filter(str.isspace, grammar))-commentcharcount
  
  #~ assert parsed_char_len == grammar_length
  
  print('Ok!')
  