ebnftest.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #
  2. # ebnftest.py
  3. #
  4. # Test script for ebnf.py
  5. #
  6. # Submitted 2004 by Seo Sanghyeon
  7. #
  8. print('Importing pyparsing...')
  9. from pyparsing import *
  10. print('Constructing EBNF parser with pyparsing...')
  11. import ebnf
  12. grammar = '''
  13. syntax = (syntax_rule), {(syntax_rule)};
  14. syntax_rule = meta_identifier, '=', definitions_list, ';';
  15. definitions_list = single_definition, {'|', single_definition};
  16. single_definition = syntactic_term, {',', syntactic_term};
  17. syntactic_term = syntactic_factor,['-', syntactic_factor];
  18. syntactic_factor = [integer, '*'], syntactic_primary;
  19. syntactic_primary = optional_sequence | repeated_sequence |
  20. grouped_sequence | meta_identifier | terminal_string;
  21. optional_sequence = '[', definitions_list, ']';
  22. repeated_sequence = '{', definitions_list, '}';
  23. grouped_sequence = '(', definitions_list, ')';
  24. (*
  25. terminal_string = "'", character - "'", {character - "'"}, "'" |
  26. '"', character - '"', {character - '"'}, '"';
  27. meta_identifier = letter, {letter | digit};
  28. integer = digit, {digit};
  29. *)
  30. '''
  31. table = {}
  32. #~ table['character'] = Word(printables, exact=1)
  33. #~ table['letter'] = Word(alphas + '_', exact=1)
  34. #~ table['digit'] = Word(nums, exact=1)
  35. table['terminal_string'] = sglQuotedString
  36. table['meta_identifier'] = Word(alphas+"_", alphas+"_"+nums)
  37. table['integer'] = Word(nums)
  38. print('Parsing EBNF grammar with EBNF parser...')
  39. parsers = ebnf.parse(grammar, table)
  40. ebnf_parser = parsers['syntax']
  41. commentcharcount = 0
  42. commentlocs = set()
  43. def tallyCommentChars(s,l,t):
  44. global commentcharcount,commentlocs
  45. # only count this comment if we haven't seen it before
  46. if l not in commentlocs:
  47. charCount = ( len(t[0]) - len(list(filter(str.isspace, t[0]))) )
  48. commentcharcount += charCount
  49. commentlocs.add(l)
  50. return l,t
  51. #ordinarily, these lines wouldn't be necessary, but we are doing extra stuff with the comment expression
  52. ebnf.ebnfComment.setParseAction( tallyCommentChars )
  53. ebnf_parser.ignore( ebnf.ebnfComment )
  54. print('Parsing EBNF grammar with generated EBNF parser...\n')
  55. parsed_chars = ebnf_parser.parseString(grammar)
  56. parsed_char_len = len(parsed_chars)
  57. print("],\n".join(str( parsed_chars.asList() ).split("],")))
  58. #~ grammar_length = len(grammar) - len(filter(str.isspace, grammar))-commentcharcount
  59. #~ assert parsed_char_len == grammar_length
  60. print('Ok!')