rendered paste body#! /usr/bin/python
from canvas2d import *
import sys
import lex
import yacc
tokens = ('NUMBER', 'LBRACE', 'RBRACE', 'LBRAC', 'RBRAC',
'TRANSLAT','ROT','SFACTOR','FDIST','NDIST','ORIENT',
'COORDINDEX','TOP','LEFT','RIGHT','BOTTOM','SEPARATOR',
'COORD3','PCAMERA','TRANSFORM','POS','IFS','COMMA',
'POINT')
#Tokens
t_LBRACE = r'\{'
t_RBRACE = r'\}'
t_LBRAC = r'\['
t_RBRAC = r'\]'
t_TRANSLAT = r'translation'
t_ROT = r'rotation'
t_SFACTOR = r'scaleFactor'
t_FDIST = r'farDistance'
t_NDIST = r'nearDistance'
t_LEFT = r'left'
t_RIGHT = r'right'
t_TOP = r'top'
t_BOTTOM = r'bottom'
t_SEPARATOR = r'Separator'
t_COORDINDEX= r'coordIndex'
t_COORD3 = r'Coordinate3'
t_PCAMERA = r'PerspectiveCamera'
t_TRANSFORM = r'Transform'
t_POS = r'position'
t_IFS = r'IndexedFaceSet'
t_ORIENT = r'orientation'
t_COMMA = r','
t_POINT = r'point'
#All numbers will be interpreted as floating point numbers
def t_NUMBER(t):
r'[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?'
try:
t.value = float(t.value)
except ValueError:
print "Unable to convert to float",t.value
sys.exit()
return t
t_ignore = " \t" #ignore whitespace
#line counter
def t_newline(t):
r'[\n\r]'
t.lineno += 1
#error handler
def t_error(t):
print "Illegal character '%s' on line %d" % (t.value[0], t.lineno)
sys.exit()
lex.lex() #build the lexer
#Parsing
def p_blocks(p):
'blocks : block block'
p[0] = p[1]
p[0].extend(p[2])
def p_block(p):
'''block : camerablock
| sepblock'''
p[0] = p[1]
def p_camerablock(p):
'camerablock : PCAMERA open cameralines close'
p[0] = ("camera",p[3])
def p_cameralines(p):
'cameralines : cameraline cameraline'
p[0] = p[1]
p[1].extend(p[2])
def p_cameraline(p):
'''cameraline : POS triple
| ORIENT quad
| NDIST NUMBER
| FDIST NUMBER
| LEFT NUMBER
| RIGHT NUMBER
| TOP NUMBER
| BOTTOM NUMBER'''
print "----------------Camera line!------"
def p_sepblock(p):
'sepblock : SEPARATOR open sepitems close'
def p_sepitems(p):
'sepitems : sepitem sepitem'
p[0] = p[1]
p[0].extend(p[2])
def p_sepitem(p):
'''sepitem : TRANSFORM open translines close
| COORD3 open POINT sqopen triples sqclose close
| IFS open ifslines close'''
def p_translines(p):
'translines : transline transline'
p[0] = p[1]
p[0].extend(p[2])
def p_transline(p):
'''transline : TRANSLAT triple
| SFACTOR triple
| ROT quad'''
def p_ifslines(p):
'ifslines : ifsline ifsline'
p[0] = p[1]
p[0].extend(p[2])
def p_ifsline(p):
'ifsline : COORDINDEX sqopen singles sqclose'
def p_quad (p):
'quad : NUMBER NUMBER NUMBER NUMBER'
p[0] = (p[1],p[2],p[3],p[4])
sys.stderr.write("Parsed a quad: (%f,%f,%f,%f)\n" % (p[1],p[2],p[3],p[4]))
def p_triple(p):
'triple : NUMBER NUMBER NUMBER'
p[0] = (p[1],p[2],p[3])
sys.stderr.write("Parsed a triple: (%f,%f,%f)\n" % (p[1],p[2],p[3]))
def p_triples(p):
'triples : triple COMMA triple'
p[0] = p[1]
p[0].extend(p[3])
def p_open(p):
'open : LBRACE'
def p_close(p):
'close : RBRACE'
def p_sqopen(p):
'sqopen : LBRAC'
def p_sqclose(p):
'sqclose : RBRAC'
def p_singles(p):
'singles : single single'
p[0] = p[1]
p[1].extend(p[2])
def p_single(p):
'single : NUMBER'
p[0] = p[1]
def p_error(t):
print "Syntax error at '%s'" % t.value
#build parser
yacc.yacc()
def main():
#while 1:
# tok = lex.token()
# if not tok: break # No more input
# print tok
while 1:
result = yacc.parse(sys.stdin.read())
#print result
if __name__ == '__main__': main()