# -*- coding: utf8 -*- #*************************************************************************** #* * #* Copyright (c) 2012 Keith Sloan * #* * #* This program is free software; you can redistribute it and/or modify * #* it under the terms of the GNU Lesser General Public License (LGPL) * #* as published by the Free Software Foundation; either version 2 of * #* the License, or (at your option) any later version. * #* for detail see the LICENCE text file. * #* * #* This program is distributed in the hope that it will be useful, * #* but WITHOUT ANY WARRANTY; without even the implied warranty of * #* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * #* GNU Library General Public License for more details. * #* * #* You should have received a copy of the GNU Library General Public * #* License along with this program; if not, write to the Free Software * #* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * #* USA * #* * #*************************************************************************** __title__="FreeCAD OpenSCAD Workbench - CSG importer Version 0.5c" __author__ = "Keith Sloan " __url__ = ["http://www.sloan-home.co.uk/ImportCSG"] # Reserved words reserved = ( 'group', 'sphere', 'cylinder', 'cube', 'multmatrix', 'intersection', 'difference', 'union', 'rotate_extrude', 'linear_extrude', 'true', 'false', 'circle', 'square', 'polygon', 'paths', 'points', 'undef', 'polyhedron', 'triangles', 'faces', 'render', 'surface', 'subdiv', 'glide', 'hull', 'minkowski', 'projection', 'import_stl', 'import_dxf', 'import', 'color', 'cut', 'offset', 'resize', ) # List of token names. This is always required tokens = reserved + ( 'WORD', 'NUMBER', 'LPAREN', 'RPAREN', 'OBRACE', 'EBRACE', 'OSQUARE', 'ESQUARE', 'COMMA', 'SEMICOL', 'EQ', 'STRING', 'ID', 'DOT', 'MODIFIERBACK', 'MODIFIERDEBUG', 'MODIFIERROOT', 'MODIFIERDISABLE' ) # Regular expression rules for simple tokens t_WORD = r'[$]?[a-zA-Z_]+[0-9]*' t_NUMBER = r'[-]?[0-9]*[\.]*[0-9]+([eE]-?[0-9]+)*' t_LPAREN = r'\(' t_RPAREN = r'\)' t_OBRACE = r'{' t_EBRACE = r'\}' t_OSQUARE = r'\[' t_ESQUARE = r'\]' t_COMMA = r',' t_SEMICOL = r';' t_EQ = r'=' t_DOT = r'\.' t_STRING = r'"[^"]*"' #t_STRING = r'["]+[a-zA-Z.]+["]+' t_MODIFIERBACK = r'%' t_MODIFIERDEBUG = r'\#' t_MODIFIERROOT = r'!' t_MODIFIERDISABLE = r'\*' # Deal with Reserved words reserved_map = { } for r in reserved: reserved_map[r.lower()] = r # Deal with Comments def t_comment1(t) : r'//[^\r\n]*((\r\n)|<>)' pass def t_comment2(t) : r'//[^\n]*((\n)|<>)' pass def t_ID(t): r'[$]?[a-zA-Z_]+[0-9]*' t.type = reserved_map.get(t.value, "ID") return t # Define a rule so we can track line numbers def t_newline(t): r'\n+' t.lexer.lineno += len(t.value) # A string containing ignored characters (spaces and tabs) t_ignore = " \t\r" # Error handling rule def t_error(t): print "Illegal character '%s'" % t.value[0] t.lexer.skip(1)