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