示例#1
0
 protected void GetToken()
 {
     pToken = icode.Get();
     token = pToken.Code;
     pNode = icode.SymtabNode;
 }
示例#2
0
 private void CondGetTokenAppend(TTokenCode tc, TErrorCode ec)
 {
     // -- Get another token only if the current one matches tc
     if (tc == token) GetTokenAppend();
     else OnError(ec);
 }
示例#3
0
        private void ExecuteStatementList(TTokenCode terminator)
        {
            // -- Loop to execute statements and skip semicolons.
            do
            {
                ExecuteStatement();
                while (token == TTokenCode.Semicolon) GetToken();

            } while (token != terminator);
        }
示例#4
0
 private bool TokenIn(TTokenCode tc, TTokenCode[] pList)
 {
     if (pList == null || pList.Length == 0) return false; // empty list
     return pList.Contains(tc);
 }
示例#5
0
 protected void GetToken()
 {
     pToken = pScanner.Get();
     token = pToken.Code;
 }
示例#6
0
        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);
                }

            }
        }
示例#7
0
        /// <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));
        }
示例#8
0
        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);
 }