blender/intern/python/modules/simpleparse/bootstrap.py
2002-10-12 11:37:38 +00:00

280 lines
9.8 KiB
Python

from TextTools.TextTools import *
#####################################################
# FOLLOWING IS THE BOOTSTRAP PARSER, HAND-CODED!
parsernamelist = [
'declarationset', # 0
'declaration', # 1
'implicit_group', # 2 --> no longer used
'added_token', # 3
'seq_added_token', #4
'fo_added_token', #5
'or_added_token', #6
'and_added_token', #7
'element_token', #8
'group', #9
'negpos_indicator', #10
'occurence_indicator', #11
'unreportedname', #12
'name', #13
'<ts>', # 14
'literal', #15
'range', # 16
'CHARBRACE', #17
'CHARDASH', # 18
'CHARRANGE', # 19
'CHARNOBRACE', # 20
'ESCAPEDCHAR', # 21
'SPECIALESCAPEDCHAR', # 22
'OCTALESCAPEDCHAR' # 23
]
parsertuplelist = range( 24 )
parsertuplelist[0] = ( # declarationset
('declaration', TableInList,(parsertuplelist, 1)), # must be at least one declaration
('declaration', TableInList,(parsertuplelist, 1),1,0)
)
parsertuplelist[1] = ( # declaration
(None, TableInList,(parsertuplelist, 14)), # ts
(None, SubTable, (
('unreportedname', TableInList,(parsertuplelist, 12),1,2),
('name', TableInList,(parsertuplelist, 13)), # name
)
),
(None, TableInList,(parsertuplelist, 14)), # ts
(None, Word, ':='),
(None, TableInList,(parsertuplelist, 14)), # ts
('element_token', TableInList,(parsertuplelist, 8)),
(None, SubTable, ( # added_token
('seq_added_token', TableInList, (parsertuplelist,4), 1, 5 ),
('fo_added_token', TableInList, (parsertuplelist,5), 1, 4 ),
('or_added_token', TableInList, (parsertuplelist,6), 1, 3 ),
('and_added_token', TableInList, (parsertuplelist,7), 1, 2 ),
(None, Fail, Here),
('seq_added_token', TableInList, (parsertuplelist,4), 1, 0 ),
('fo_added_token', TableInList, (parsertuplelist,5), 1, -1 ),
('or_added_token', TableInList, (parsertuplelist,6), 1, -2 ),
('and_added_token', TableInList, (parsertuplelist,7), 1, -3 ),
),1,1),
(None, TableInList,(parsertuplelist, 14)), # ts
)
parsertuplelist[3] = ( # added_token
('seq_added_token', TableInList, (parsertuplelist,4), 1, 5 ),
('fo_added_token', TableInList, (parsertuplelist,5), 1, 4 ),
('or_added_token', TableInList, (parsertuplelist,6), 1, 3 ),
('and_added_token', TableInList, (parsertuplelist,7), 1, 2 ),
(None, Fail, Here),
('seq_added_token', TableInList, (parsertuplelist,4), 1, 0 ),
('fo_added_token', TableInList, (parsertuplelist,5), 1, -1 ),
('or_added_token', TableInList, (parsertuplelist,6), 1, -2 ),
('and_added_token', TableInList, (parsertuplelist,7), 1, -3 ),
)
parsertuplelist[4] = ( # seq_added_token
(None, TableInList,(parsertuplelist, 14)), # ts
(None, Is, ','),
(None, TableInList,(parsertuplelist, 14)), # ts
('element_token', TableInList,(parsertuplelist, 8)),
(None, TableInList,(parsertuplelist, 14),4,1), # ts
(None, Is, ',',3,1),
(None, TableInList,(parsertuplelist, 14),2,1), # ts
('element_token', TableInList,(parsertuplelist, 8),1,-3),
)
parsertuplelist[5] = ( # fo_added_token
(None, TableInList,(parsertuplelist, 14)), # ts
(None, Is, '/'),
(None, TableInList,(parsertuplelist, 14)), # ts
('element_token', TableInList,(parsertuplelist, 8)),
(None, TableInList,(parsertuplelist, 14),4,1), # ts
(None, Is, '/',3,1),
(None, TableInList,(parsertuplelist, 14),2,1), # ts
('element_token', TableInList,(parsertuplelist, 8),1,-3),
)
parsertuplelist[6] = ( # or_added_token
(None, TableInList,(parsertuplelist, 14)), # ts
(None, Is, '|'),
(None, TableInList,(parsertuplelist, 14)), # ts
('element_token', TableInList,(parsertuplelist, 8)),
(None, TableInList,(parsertuplelist, 14),4,1), # ts
(None, Is, '|',3,1),
(None, TableInList,(parsertuplelist, 14),2,1), # ts
('element_token', TableInList,(parsertuplelist, 8),1,-3),
)
parsertuplelist[7] = ( # and_added_token
(None, TableInList,(parsertuplelist, 14)), # ts
(None, Is, '&'),
(None, TableInList,(parsertuplelist, 14)), # ts
('element_token', TableInList,(parsertuplelist, 8)),
(None, TableInList,(parsertuplelist, 14),4,1), # ts
(None, Is, '&',3,1),
(None, TableInList,(parsertuplelist, 14),2,1), # ts
('element_token', TableInList,(parsertuplelist, 8),1,-3),
)
parsertuplelist[8] = ( # element_token
('negpos_indicator', TableInList,(parsertuplelist, 10),1,1),
(None, TableInList,(parsertuplelist, 14),1,1), # ts, very inefficient :(
('literal', TableInList, (parsertuplelist,15),1, 4 ),
('range', TableInList, (parsertuplelist,16),1, 3 ),
('group', TableInList, (parsertuplelist,9),1, 2 ),
('name', TableInList, (parsertuplelist,13) ),
(None, TableInList,(parsertuplelist, 14),1,1), # ts, very inefficient :(
('occurence_indicator', TableInList,(parsertuplelist, 11), 1,1),
)
parsertuplelist[9] = ( # group
(None, Is, '('),
(None, TableInList,(parsertuplelist, 14),1,1), # ts
('element_token', TableInList, (parsertuplelist,8) ),
(None, SubTable, ( # added_token
('seq_added_token', TableInList, (parsertuplelist,4), 1, 5 ),
('fo_added_token', TableInList, (parsertuplelist,5), 1, 4 ),
('or_added_token', TableInList, (parsertuplelist,6), 1, 3 ),
('and_added_token', TableInList, (parsertuplelist,7), 1, 2 ),
(None, Fail, Here),
('seq_added_token', TableInList, (parsertuplelist,4), 1, 0 ),
('fo_added_token', TableInList, (parsertuplelist,5), 1, -1 ),
('or_added_token', TableInList, (parsertuplelist,6), 1, -2 ),
('and_added_token', TableInList, (parsertuplelist,7), 1, -3 ),
),1,1),
(None, TableInList,(parsertuplelist, 14),1,1), # ts
(None, Is, ')'),
)
parsertuplelist[10] = ( # negpos_indicator
(None, Is, "+",1,2),
(None, Is, "-"),
)
parsertuplelist[11] = ( #occurence_indicator
(None, Is, "+",1,3),
(None, Is, "*",1,2),
(None, Is, '?'),
)
parsertuplelist[12] = ( #unreportedname
(None, Is, '<'),
('name', TableInList, (parsertuplelist, 13)), # inefficiency in final system :(
(None, Is, '>'),
)
parsertuplelist[13] = ( # name
(None, IsIn, alpha+'_'),
(None, AllIn, alphanumeric+'_',1,1)
)
parsertuplelist[14] = ( # ts (whitespace)
(None, AllIn, ' \011\012\013\014\015',1,1),
(None, SubTable, (
(None, Is, '#' ),
(None, AllNotIn, '\n',1,1 ) # problem if there's a comment at the end of the file :(
)
,1,-1 ),
)
# this isn't actually used in the bootstrap parser...
_specialescapedchar = parsertuplelist[22] = ( # SPECIALESCAPEDCHAR
('SPECIALESCAPEDCHAR', IsIn, '\\abfnrtv'),
)
_octalescapechar = parsertuplelist[23] = ( # OCTALESCAPEDCHAR
(None, IsIn, '01234567'),
(None, IsIn, '01234567',2),
(None, IsIn, '01234567',1),
)
_escapedchar = parsertuplelist[21] = ( # escapedcharacter
(None, Is, '\\' ),
('SPECIALESCAPEDCHAR', IsIn, '\\abfnrtv',1,4),
('OCTALESCAPEDCHAR', SubTable, _octalescapechar)
)
_charnobrace = parsertuplelist[20] = ( # charnobrace
('ESCAPEDCHAR', Table, _escapedchar, 1,2),
('CHAR', IsNot, ']'),
)
_rangedef = parsertuplelist[19] = ( # charrange
('CHARNOBRACE', Table, _charnobrace ),
(None, Is, '-'),
('CHARNOBRACE', Table, _charnobrace ),
)
parsertuplelist[16] = ( #range
(None, Is, '['),
('CHARBRACE', Is, ']',1,1),
('CHARDASH', Is, '-',1,1),
('CHARRANGE', Table, _rangedef, 1,0),
(None, SubTable, _charnobrace, 1,-1),
(None, Is, ']')
)
_sqstr = (
(None, Is, "'" ),
# (None, Is, "'",1, 5 ), # immediate close
(None, AllNotIn, "\\'",1,1 ), # all not an escape or end
(None, Is, "\\", 2, 1), # is an escaped char
(None, Skip, 1, 1, -2), # consume the escaped char and loop back
(None, Is, "'" ) # in case there was no matching ', which would also cause a fail for allnotin
)
_dblstr = (
(None, Is, '"' ),
# (None, Is, '"',1, 5 ), # immediate close
(None, AllNotIn, '\\"' ,1,1), # not an escaped or end
(None, Is, "\\", 2, 1), # is an escaped char
(None, Skip, 1, 1, -2), # consume the escaped char and loop back
(None, Is, '"' ) # in case there was no matching ", which would also cause a fail for allnotin
)
# literal := ("'",(CHARNOSNGLQUOTE/ESCAPEDCHAR)*,"'") / ('"',(CHARNODBLQUOTE/ESCAPEDCHAR)*,'"')
parsertuplelist[15] = ( # literal
(None, Is, "'", 4, 1 ),
('CHARNOSNGLQUOTE', AllNotIn, "\\'",1,1 ), # all not an escape or end
('ESCAPEDCHAR', Table, _escapedchar, 1, -1),
(None, Is, "'", 1,5 ),
(None, Is, '"' ),
('CHARNODBLQUOTE', AllNotIn, '\\"',1,1 ), # all not an escape or end
('ESCAPEDCHAR', Table, _escapedchar, 1, -1),
(None, Is, '"'),
)
declaration = r'''declarationset := declaration+
declaration := ts , (unreportedname/name) ,ts,':=',ts, element_token, ( seq_added_token / fo_added_token / or_added_token / and_added_token )*, ts
seq_added_token := (ts,',',ts, element_token)+
fo_added_token := (ts,'/',ts, element_token)+
or_added_token := (ts,'|',ts, element_token)+ # not currently supported
and_added_token := (ts,'&',ts, element_token)+ # not currently supported
element_token := negpos_indicator?, ts, (literal/range/group/name),ts, occurence_indicator?
group := '(',ts, element_token, ( seq_added_token / fo_added_token / or_added_token / and_added_token )*, ts, ')'
negpos_indicator := '+'/'-'
occurence_indicator := '+'/'*'/'?'
unreportedname := '<', name, '>'
name := [a-zA-Z_],[a-zA-Z0-9_]*
<ts> := ( [ \011-\015]+ / ('#',-'\n'+,'\n')+ )*
literal := ("'",(CHARNOSNGLQUOTE/ESCAPEDCHAR)*,"'") / ('"',(CHARNODBLQUOTE/ESCAPEDCHAR)*,'"')
range := '[',CHARBRACE?,CHARDASH?, (CHARRANGE/CHARNOBRACE)*, CHARDASH?,']'
CHARBRACE := ']'
CHARDASH := '-'
CHARRANGE := CHARNOBRACE, '-', CHARNOBRACE
CHARNOBRACE := ESCAPEDCHAR/CHAR
CHAR := -[]]
ESCAPEDCHAR := '\\',( SPECIALESCAPEDCHAR / OCTALESCAPEDCHAR )
SPECIALESCAPEDCHAR := [\\abfnrtv]
OCTALESCAPEDCHAR := [0-7],[0-7]?,[0-7]?
CHARNODBLQUOTE := -[\\"]+
CHARNOSNGLQUOTE := -[\\']+
'''
def parse( instr = declaration, parserelement = 'declarationset' ):
tbl = (
(parserelement, Table, parsertuplelist[parsernamelist.index( parserelement )] ),
)
return tag( instr, tbl)
if __name__ == '__main__':
import sys, pprint
pprint.pprint( apply( parse, tuple( sys.argv[1:] ) ) )