Changeset 110

Show
Ignore:
Timestamp:
12/10/07 07:17:00 (1 year ago)
Author:
tal
Message:
- Added support for enum in GPOS Lookup Type 2.
- The parser will raise an error when it encounters something it can't parse. Specifically, it will raise FeaToolsParserSyntaxError.
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • packages/feaTools/trunk/Lib/feaTools/parser.py

    r58 r110  
    11import re 
    22 
    3 DEBUG = False 
     3 
     4class FeaToolsParserSyntaxError(Exception): 
     5 
     6    def __init__(self, value): 
     7        self.value = value 
     8 
     9    def __str__(self): 
     10        return repr(self.value) 
     11 
    412 
    513# used for removing all comments 
     
    134142posType2RE = re.compile( 
    135143    "([\s;\{\}]|^)"        # whitepace, ; {, } or start of line 
    136     "position|pos\s+"      # pos 
     144    "(enum\s+|\s*)"        # enum 
     145    "(position|pos\s+)"    # pos 
    137146    "([-\w\d\s_.@\[\]]+)"  # left, right, value 
    138147    "\s*;"                 # ; 
     
    245254    # pos type 2 
    246255    posType2s = posType2RE.findall(text) 
    247     for precedingMark, targetAndValue in posType2s: 
     256    for precedingMark, enumTag, posTag, targetAndValue in posType2s: 
    248257        text = _executeSimpleSlice(precedingMark, text, posType2RE, writer) 
    249258        _parsePosType2(writer, targetAndValue) 
     
    274283        text = _executeSimpleSlice(precedingMark, text, includeRE, writer) 
    275284        writer.include(path) 
    276     if DEBUG: 
    277         text = text.strip() 
    278         if text: 
    279             print ">>> unknown >>>", text 
     285    text = text.strip() 
     286    if text: 
     287        raise FeaToolsParserSyntaxError("Invalid Syntax: %s" % text) 
    280288 
    281289def _executeSimpleSlice(precedingMark, text, regex, writer): 
     
    388396    writer.gposType2(target, value) 
    389397 
     398def _parsePosType2WithEnum(writer, targetAndValue): 
     399    # the target and value will be coming 
     400    # in as single string. 
     401    target = " ".join(targetAndValue.split(" ")[:-1]) 
     402    value = targetAndValue.split(" ")[-1] 
     403    # XXX this could cause a choke 
     404    value = float(value) 
     405    target = _parseSequence(target) 
     406    writer.gposType2(target, value) 
     407 
    390408def parseFeatures(writer, text): 
    391409    # strip the comments