def genSym (self): """BisonParser.genSym() """ self.genSymCount = self.genSymCount + 1 tokenName = '@%d' % self.genSymCount sym = BisonSymbols.getSymbol(tokenName) sym.klass = BisonSymbols.SNTERM sym.value = self.nVars self.nVars = self.nVars + 1 return sym
def parse (self): """BisonParser.parse() """ self.valueComponentsUsed = 0 self.nSyms = 1 self.nVars = 0 self.nRules = 0 self.nItems = 0 self.genSymCount = 0 self.startVal = None self.productions = [] errtoken = BisonSymbols.getSymbol("error") errtoken.klass = BisonSymbols.STOKEN errtoken.userTokenNumber = 256 undeftoken = BisonSymbols.getSymbol("$undefined") undeftoken.klass = BisonSymbols.STOKEN undeftoken.userTokenNumber = 2 self.readDeclarations() self.readGrammar()
def lex (self): if self.unlexed_symval != None: self.symval = self.unlexed_symval self.unlexed_symval = None return self.unlexed idSpace = string.letters + "_" + "." c = self.skipWhiteSpace() if c == None: self.strval = "EOF" return ENDFILE elif c in idSpace: idSpace = idSpace + string.digits tokenBuf = "" while c in idSpace: tokenBuf = tokenBuf + c c = self.getc() self.ungetc() self.strval = tokenBuf self.symval = BisonSymbols.getSymbol(tokenBuf) return IDENTIFIER elif c in string.digits: numval = 0 tokenBuf = "" while c in string.digits: tokenBuf = tokenBuf + c numval = (numval * 10) + (ord(c) - ord('0')) c = self.getc() self.strval = tokenBuf return NUMBER elif c == "'": translations = -1 tokenBuf, code, dummy = self.literalChar("'") c = self.getc() if c != "'": self.warn('use "..." for multi-character literal tokens') while 1: dummy, dummy1, wasquote = self.literalChar("'") if wasquote == 1: break self.strval = "'" + tokenBuf + "'" self.symval = BisonSymbols.getSymbol(self.strval) self.symval.klass = BisonSymbols.STOKEN if self.symval.userTokenNumber == None: self.symval.userTokenNumber = ord(code) return IDENTIFIER elif c == '"': translations = -1 tokenBuf = c while 1: next, code, wasquote = self.literalChar('"') tokenBuf = tokenBuf + next if wasquote: break self.strval = tokenBuf self.symval = BisonSymbols.getSymbol(tokenBuf) self.symval.klass = BisonSymbols.STOKEN return IDENTIFIER elif c == ',': return COMMA elif c == ':': return COLON elif c == ';': return SEMICOLON elif c == '|': return BAR elif c == '{': return LEFT_CURLY elif c == '=': c = self.getc() while c in string.whitespace: if c == '\n': self.lineno = self.lineno + 1 c = self.getc() if c == '{': self.strval = "={" return LEFT_CURLY else: self.ungetc() return ILLEGAL elif c == '<': c = self.getc() tokenBuf = "" while c != '>': if c == None: self.fatal("unterminated type name at end of file") if c == '\n': self.warn("unterminated type name.") self.ungetc() break tokenBuf = tokenBuf + c c = self.getc() self.strval = tokenBuf return TYPENAME elif c == '%': return self.parsePercentToken() else: return ILLEGAL