Beispiel #1
0
    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()
Beispiel #2
0
    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
Beispiel #3
0
    def __init__ (self, dataStr = None):
	StringLexor.__init__(self, dataStr)
	self.symval = None
	BisonSymbols.initialize()
Beispiel #4
0
    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