protected void GetToken() { pToken = icode.Get(); token = pToken.Code; pNode = icode.SymtabNode; }
private void CondGetTokenAppend(TTokenCode tc, TErrorCode ec) { // -- Get another token only if the current one matches tc if (tc == token) GetTokenAppend(); else OnError(ec); }
private void ExecuteStatementList(TTokenCode terminator) { // -- Loop to execute statements and skip semicolons. do { ExecuteStatement(); while (token == TTokenCode.Semicolon) GetToken(); } while (token != terminator); }
private bool TokenIn(TTokenCode tc, TTokenCode[] pList) { if (pList == null || pList.Length == 0) return false; // empty list return pList.Contains(tc); }
protected void GetToken() { pToken = pScanner.Get(); token = pToken.Code; }
private void Resync(TTokenCode[] pList1, TTokenCode[] pList2 = null, TTokenCode[] pList3 = null) { // -- Is the current otken in one of the lists? bool errorFlag = (!TokenIn(token, pList1)) && (!TokenIn(token, pList2)) && (!TokenIn(token, pList3)); if (errorFlag) { // -- Nope. Flag it as an error. TErrorCode errorCode = (token == TTokenCode.EndOfFile) ? TErrorCode.UnexpectedEndOfFile : TErrorCode.UnexpectedToken; OnError(errorCode); // -- Skip tokens while ((!TokenIn(token, pList1)) && (!TokenIn(token, pList2)) && (!TokenIn(token, pList3)) && (token != TTokenCode.Period) && (token != TTokenCode.EndOfFile)) { GetToken(); } // -- Flag an unexpected end of file (if hanve't already) if ((token == TTokenCode.EndOfFile) && (errorCode != TErrorCode.UnexpectedEndOfFile)) { OnError(TErrorCode.UnexpectedEndOfFile); } } }
/// <summary> /// Parses the statement list until the terminator token /// </summary> /// <param name="terminator">The terminator.</param> private void ParseStatementList(TTokenCode terminator) { // -- Loop to parse staements and to check for and skip semicolons. do { ParseStatement(); if (TokenIn(token, tlStatementStart)) { OnError(TErrorCode.MissingSemicolon); } else while (token == TTokenCode.Semicolon) GetTokenAppend(); } while ((token != terminator) && (token != TTokenCode.EndOfFile)); }
private void ParseIdentifierConstant(SymtabNode pId1, TTokenCode sign) { SymtabNode pId2 = Find(pToken.TokenString); // ptr to <id-2> if (pId2.defn.how != TDefnCode.dcConstant) { OnError(TErrorCode.NotAConstantIdentifier); TType.SetType(ref pId1.pType, TType.pDummyType); GetToken(); return; } // -- Integer identifier if (pId2.pType == TType.pIntegerType) { pId1.defn.constantValue.integerValue = sign == TTokenCode.Minus ? -pId2.defn.constantValue.integerValue : pId2.defn.constantValue.integerValue; TType.SetType(ref pId1.pType, TType.pIntegerType); } // -- Real identifier else if (pId2.pType == TType.pRealType) { pId1.defn.constantValue.realValue = sign == TTokenCode.Minus ? -pId2.defn.constantValue.realValue : pId2.defn.constantValue.realValue; TType.SetType(ref pId1.pType, TType.pRealType); } // -- Character identifier: No unary sign allowed else if (pId2.pType == TType.pCharType) { if (sign != TTokenCode.Dummy) OnError(TErrorCode.InvalidConstant); pId1.defn.constantValue.characterValue = pId2.defn.constantValue.characterValue; TType.SetType(ref pId1.pType, TType.pCharType); } // -- Enumeration identifier: No unary sign allowed. else if (pId2.pType.Form == TFormCode.fcEnum) { if (sign != TTokenCode.Dummy) OnError(TErrorCode.InvalidConstant); pId1.defn.constantValue.integerValue = pId2.defn.constantValue.integerValue; TType.SetType(ref pId1.pType, pId2.pType); } // -- Array identifier: Must be character array, and // no unary sign allowed. else if (pId2.pType.Form == TFormCode.fcArray) { if ((sign != TTokenCode.Dummy) || (pId2.pType.array.pElmtType != TType.pCharType)) { OnError(TErrorCode.InvalidConstant); } pId1.defn.constantValue.stringValue = pId2.defn.constantValue.stringValue; TType.SetType(ref pId1.pType, pId2.pType); } GetToken(); }
public void Put(TTokenCode tokenCode) { m_formatter.Write((int)tokenCode); }
private void AddReservedWord(string tokenString, TTokenCode tokenCode) { ReservedWord rw = new ReservedWord() { Code = tokenCode, TokenString = tokenString }; reservedWords.Add(tokenString.ToLower(), rw); }