FreeCAD/src/Mod/OpenSCAD/tokrules.py
2016-09-22 10:18:24 -03:00

137 lines
3.7 KiB
Python

# -*- coding: utf8 -*-
#***************************************************************************
#* *
#* Copyright (c) 2012 Keith Sloan <keith@sloan-home.co.uk> *
#* *
#* 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 <keith@sloan-home.co.uk>"
__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',
'text',
'polygon',
'paths',
'points',
'undef',
'polyhedron',
'triangles',
'faces',
'render',
'surface',
'subdiv',
'glide',
'hull',
'minkowski',
'projection',
'import',
'color',
'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)|<<EOF>>)'
pass
def t_comment2(t) :
r'//[^\n]*((\n)|<<EOF>>)'
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)