# # 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!')