freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于gui的交互式編譯系統(tǒng)之中間代碼生成器的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文-閱讀頁

2024-09-17 19:18本頁面
  

【正文】 容器 inner_scopes_存儲(chǔ)嵌套的內(nèi)部作用域,容器中的每個(gè)元素為指向內(nèi)部作用域符號(hào)表的指針。在創(chuàng)建一個(gè)符號(hào)表時(shí),要為其傳遞外部作用域符號(hào)表參數(shù),若當(dāng)前創(chuàng)建的符號(hào)表為根符號(hào)表,則默認(rèn)為其傳遞參數(shù) NULL。一是插入 Symbol,二是插入詞素和詞法單元標(biāo)記。 class SymbolTable { public: SymbolTable(SymbolTable* prev = NULL) : outer_scope_(prev) {} ~SymbolTable()。 bool Insert(const std::stringamp。 bool IsInCurrentScope(const std::stringamp。 // 重載了運(yùn)算符 [],可以直接通過 symboltable[key]來獲取 value。 key)。 // 內(nèi)部作用域指針。 } private: SymbolTable* outer_scope_。 std::unordered_mapstd::string, Symbol* table_。 類 Symbol 表示符號(hào)表的符號(hào),它也是類 VariableSymbol 和類 FunctionSymbol 的基類。 class Symbol { public: Symbol(const std::stringamp。 } TokenTag token_tag() const { return token_tag_。 private: std::string lexeme_。 TokenTag token_tag_。 }。 offset_表示變量的偏移量,與變量在內(nèi)存的布局有關(guān); width_表示變量類型的寬度; size_表示變量占用的字節(jié)數(shù);is_array_表示變量是否是數(shù)組; data_type_表示變量的類型, DataType 是一個(gè)枚舉類型,其中有三個(gè)元素, VOID_TYPE、 INT_TYPE 和 CHAR_TYPE; kind_表示變量的種類,VariableKind 是一個(gè)枚舉類型,其中有兩個(gè)元素, LOCAL 表示變量是局部變量,ARGUMENT 表示變量是參數(shù)。 identifier) : Symbol(identifier, ID) {} private: unsigned int offset_。 unsigned int width_。 unsigned int size_。 bool is_array_。 DataType data_type_。 VariableKind kind_。 }。 enum VariableKind { LOCAL, ARGUMENT }。包括函數(shù)標(biāo)示符,返回類型基于 GUI 的交互式編譯系統(tǒng)之中間代碼生成器的設(shè)計(jì)與實(shí)現(xiàn) 22 及參數(shù)信息。 identifier, DataType return_type) : Symbol(identifier, ID), return_type_(return_type) {} DataType return_type() const { return return_type_。 // 參數(shù)列表。 // 函數(shù)的返回類型。 類 Parameter 保存 函數(shù)的參數(shù)信息。 class Parameter { public: Parameter(DataType type, const std::stringamp。 } std::string identifier() const { return identifier_。 } private: DataType type_。 std::string identifier_。 bool is_array_。 }。用枚舉類型TokenTag 實(shí)現(xiàn)。在詞法分析階段,符號(hào)所代表的具體意義尚未知曉,在語法分析階段,才確定符號(hào)的具體意義。它可以表示不同的語言元素,比如可基于 GUI 的交互式編譯系統(tǒng)之中間代碼生成器的設(shè)計(jì)與實(shí)現(xiàn) 23 能是一個(gè)指針,或者乘號(hào)。 enum TokenTag { END_OF_FILE = EOF, PLUS = (int)39。, MINUS = (int)39。, ASTERISK = (int)39。, FORWARD_SLASH = (int)39。, PERCENT = (int)39。, EQUAL = (int)39。, LESS = (int)39。, GREATER = (int)39。, OPEN_BRACE = (int)39。, CLOSE_BRACE = (int)39。, OPEN_PAREN = (int)39。, CLOSE_PAREN = (int)39。, OPEN_BRACKET = (int)39。, CLOSE_BRACKET = (int)39。, COMMA = (int)39。, COLON = (int)39。, SEMICOLON = (int)39。, EXCLAMATION = (int)39。, LESS_OR_EQUAL = 400, GREATER_OR_EQUAL = 401, EQUAL_EQUAL = 402, NOT_EQUAL = 403, OR = 404, AND = 405, PLUS_PLUS = 406, 基于 GUI 的交互式編譯系統(tǒng)之中間代碼生成器的設(shè)計(jì)與實(shí)現(xiàn) 24 MINUS_MINUS = 407, ID = 256, NUM_LITERAL = 257, STRING_LITERAL = 258, // 保留關(guān)鍵字。 詞法分析器 詞法分析器的實(shí)現(xiàn)按照 節(jié)原理。隨著字符的讀入,從一個(gè)狀態(tài)轉(zhuǎn)換到另一個(gè)狀態(tài)。 詞法分析器由類 Lexer 實(shí)現(xiàn),可用通過 GetNextToken()獲取下一個(gè) Token,或者通過 PeekNextToken()查看下一個(gè) Token。amp。 : , ? 數(shù)字字面值和字符、字符串字面值:如 123 ‘ a’“ name” ? 標(biāo)示符:如變量名、函數(shù)名等 ? 關(guān)鍵字: if else do while for return break continue switch case default goto int char void printInt printStr printChar readInt readStr 當(dāng)遇到一個(gè)單一符號(hào),如“ +”,先假設(shè)它是多重符號(hào),所以繼續(xù)讀取下一個(gè)字符,如果下一個(gè)字符是“ +”,則返回 token“ ++”,否則返回 token“ +”,并且回退一個(gè)字符。 class Lexer { public: Lexer(const std::stringamp。 ~Lexer()。 symbol_table)。 symbol_table)。 } private: void GetNextChar()。 char PeekNextChar()。 Token ScanToken(SymbolTableamp。 基于 GUI 的交互式編譯系統(tǒng)之中間代碼生成器的設(shè)計(jì)與實(shí)現(xiàn) 26 std::string source_file_。 std::ifstream input_stream_。 char current_character_。 }。 語法分析器由類 Parser 實(shí)現(xiàn)。 語句的處理函數(shù)為 ParseStatements(),遇到 if 則調(diào)用 if 處理過程,遇到 for 則調(diào)用for 處理過程。 函數(shù) ParseBlock()解析塊并實(shí)現(xiàn)作用域,如果正在解析一個(gè)函數(shù),則傳遞相應(yīng)的函數(shù)符號(hào)表參數(shù),如果是一個(gè)一般的作用域或一個(gè)條件語句,傳遞 NULL,這也是默認(rèn)參數(shù)。 函數(shù) NextToken()從詞法分析器獲得下一個(gè) token;函數(shù) Match()匹配 token 并獲取下一個(gè) token,如果有錯(cuò)誤,則生成錯(cuò)誤信息。 變量 offset_記錄局部變量的相對(duì)偏移量;變量 temp_counter_和 label_counter_記錄臨時(shí)變量和標(biāo)記的計(jì)數(shù);變量 current_token_記錄當(dāng)前正在解析的 token。 ~Parser()。 private: void NextToken()。 void Match(TokenTag tag)。 msg)。 void EmitLabel(const std::stringamp。 void EmitLabel(LabelOperand* label)。 LabelOperand* NewLabel()。 void ParseFunctions()。 void ParseDeclarations()。 var_id)。 void ParseStatement()。 Operand* ParseBool()。 Operand* ParseEquality()。 Operand* ParseExpr()。 Operand* ParseFactor()。 基于 GUI 的交互式編譯系統(tǒng)之中間代碼生成器的設(shè)計(jì)與實(shí)現(xiàn) 28 Operand* ParseFunctionCall(const std::stringamp。 std::vectorOperand** ParseArgumentsList()。 // 臨時(shí)變量計(jì)數(shù)。 // 變量相對(duì)地址。 // 標(biāo)號(hào)計(jì)數(shù)。 // 指向詞法分析器。 // 用于 break。 // 用于 continue。 // 當(dāng)前作用域符號(hào)表。 // 根符號(hào)表 FunctionSymbol* current_function_。 Token current_token_。 }。 IntermediateOp 是一個(gè)枚舉類型。 class IntermediateInstr { public: IntermediateInstr(IntermediateOp op, Operand* operand1 = NULL, Operand* operand2 = NULL, Operand* operand3 = NULL) : operation_(op), operand1_(operand1), operand2_(operand2), operand3_(operand3) {} IntermediateOp operation() { return operation_。 } 基于 GUI 的交互式編譯系統(tǒng)之中間代碼生成器的設(shè)計(jì)與實(shí)現(xiàn) 29 Operand* operand2() { return operand2_。 } std::string ToString()。 // 操作符。 // 操作數(shù) 。 // 操作數(shù)。 // 操作數(shù)。 枚舉類型 IntermediateOP 存儲(chǔ)跟四元式中運(yùn)算符相關(guān)的信息。=39。+39。39。*39。/39。!39。%39。39。39。 GUI 本設(shè)計(jì)實(shí)現(xiàn)的圖形界面包含菜單欄、標(biāo)簽欄及編輯框。如圖 所示。編輯框支持顯示行號(hào),可在視圖“ View”菜單中選中“ Line Number Margin”進(jìn)行顯示。如果 所示。 圖 菜單 File 菜單“ Edit”包含的菜單項(xiàng)有“ Undo”、“ Redo”、“ Cut”、“ Copy”、“ Paste”、“ Delete”、“ Select All”、“ Find… ”、“ Find Next”、“ Replace”。 “ Find Next”:查找下一個(gè); “ Replace”:點(diǎn)擊顯示替換對(duì)話框,如圖 所示。匹配時(shí)要進(jìn)行查找,此處查找功能與“ Find… ”相同,同樣可以選擇匹配整個(gè)單詞、匹配大小寫、匹配正則表達(dá)式、循環(huán)匹配,查找方向可為上或下。如圖 所示。 圖 菜單 View 菜單“ Tool”包含的菜單項(xiàng)有“ Translate”。點(diǎn)擊“ Translate”將源代碼轉(zhuǎn)換成中間代碼。如圖 所示。 class FrontEnd : public Window { public: FrontEnd():Window(), _mainWindowStatus(0), _pMainSplitter(NULL), _hTabPopupMenu(NULL), _pEditView(NULL), _pDocTab(NULL){}。 virtual ~FrontEnd()。 virtual void destroy()。 void setTitle(const char *title) const。 bool isDlgMsg(MSG *msg) const。 private: static const char _className[32]。 unsigned char _mainWindowStatus。 DocTabView _subDocTab。 ScintillaEditView _mainEditView。 ScintillaEditView *_pEditView。 SplitterContainer _subSp
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1