//------------------------------------------------------------ // CNameManager.AddKeywords // /// <summary> /// <para>Add all the keywords to the name table. /// To enable fast determination of whether a particular NAME is a keyword, /// a seperate keyword hash table is used that is indexed by the hash value of the name. /// At most one keyword has the same index, /// so we don't need a collision resolution scheme.</para> /// <para> /// <list type="bullet"> /// <item>Get keywords form CParser, /// and Register them to namesDictionary and keywordsDictionary.</item> /// <item>Register keywords of preprocessor to namesDictionary.</item> /// <item>Register predefined names to namesDictionary.</item> /// </list> /// </para> /// </summary> //------------------------------------------------------------ private void AddKeywords() { TOKINFO tok = null; // TOKENID.ARGS = 1 (TOKENID == 0 means UNDEFINED.) for (TOKENID id = TOKENID.ARGS; id < TOKENID.IDENTIFIER; ++id) { tok = CParser.GetTokenInfo(id); DebugUtil.Assert(tok != null); AddString(tok.Text); keywordsDictionary.Add(tok.Text, id); } for (int i = 1; i < preprocessourKeywords.Length; ++i) { string kw = preprocessourKeywords[i]; AddString(kw); this.preprocessorKeyWordDictionary.Add(kw, i); } for (int i = 1; i < attributeTargets.Length; ++i) { string target = attributeTargets[i]; AddString(target); attributeTargetDictionary.Add(target, (ATTRTARGET)i); } }
//------------------------------------------------------------ // CNameManager.GetTokenText // /// <summary> /// Return the string of the token. /// </summary> /// <param name="tokenId"></param> /// <returns></returns> //------------------------------------------------------------ virtual internal string GetTokenText(TOKENID tokenId) { TOKINFO tok = CParser.GetTokenInfo(tokenId); if (tok != null) { return(tok.Text); } return(null); }
internal bool RightAssociativity; // Associativity //------------------------------------------------------------ // OPINFO Constructor //------------------------------------------------------------ internal OPINFO(TOKENID id, int prec, bool rassoc) { this.TokenID = id; this.Precedence = prec; this.RightAssociativity = rassoc; }
//------------------------------------------------------------ // CParser.ParseObjectInitializer // /// <summary></summary> /// <param name="newNode"></param> //------------------------------------------------------------ internal void ParseObjectInitializer(NEWNODE newNode) { DebugUtil.Assert(CurrentTokenID() == TOKENID.OPENCURLY); NextToken(); DECLSTMTNODE stmtNode = AllocNode(NODEKIND.DECLSTMT, newNode) as DECLSTMTNODE; CListMaker list = new CListMaker(this); int comma = -1; while ( CurrentTokenID() != TOKENID.CLOSECURLY && CurrentTokenID() != TOKENID.ENDFILE) { if (CurrentTokenID() == TOKENID.IDENTIFIER && PeekToken(1) == TOKENID.EQUAL) { list.Add( ParseVariableDeclarator( stmtNode, stmtNode, (uint)PARSEDECLFLAGS.LOCAL, false, // isFirst, -1), comma); } else { Error(CSCERRID.ERR_InvalidInitializerDeclarator); TOKENID tid = CurrentTokenID(); while ( tid != TOKENID.COMMA && tid != TOKENID.CLOSECURLY && tid != TOKENID.ENDFILE) { NextToken(); tid = CurrentTokenID(); } } if (CurrentTokenID() != TOKENID.COMMA) { break; } comma = CurrentTokenIndex(); NextToken(); } Eat(TOKENID.CLOSECURLY); stmtNode.VariablesNode = list.GetList(stmtNode); newNode.InitialNode = stmtNode; newNode.Flags |= NODEFLAGS.NEW_HAS_OBJECT_INITIALIZER; if (newNode.ParentNode != null && newNode.ParentNode.Kind == NODEKIND.VARDECL) { VARDECLNODE vdNode = newNode.ParentNode as VARDECLNODE; if (vdNode != null) { newNode.Flags |= NODEFLAGS.NEW_IN_VARDECL; vdNode.NewFlags |= NODEFLAGS.NEW_HAS_OBJECT_INITIALIZER; } } else if (newNode.ParentNode != null && newNode.ParentNode.Kind == NODEKIND.BINOP && newNode.Operator == OPERATOR.ASSIGN) { VARDECLNODE vdNode = newNode.ParentNode.ParentNode as VARDECLNODE; if (vdNode != null) { newNode.Flags |= NODEFLAGS.NEW_IN_VARDECL; vdNode.NewFlags |= NODEFLAGS.NEW_HAS_OBJECT_INITIALIZER; } } BASENODE node = newNode.ParentNode; while (node != null && !node.IsStatement) { node = node.ParentNode; } if (node != null) { (node as STATEMENTNODE).NewFlags |= NODEFLAGS.NEW_HAS_OBJECT_INITIALIZER; } }
//------------------------------------------------------------ // CNameManager.KeywordName // /// <summary> /// Return the string of the keyword corresponding to the specified index. /// </summary> /// <param name="keyword"></param> /// <returns></returns> //------------------------------------------------------------ internal string KeywordName(TOKENID keyword) { TOKINFO tok = CParser.GetTokenInfo(keyword); return(tok != null ? tok.Text : null); }