compiler-construction

    1熱度

    1回答

    讓我們看看詞法分析中標識符的狀態圖。基本上,它說,只要分析儀讀取除數字字母之外的任何字符,則將該標記返回爲(標識符,屬性)對。所以,根據這條規則, 在讀取字符串dtf56 * f %% f時,生成的令牌如下? dtf56:標識符 F:標識 F:標識 我想的是,詞法分析器應該在這種情況下,拋出一個錯誤,因爲這是一個字符串。作爲一個普遍的問題,什麼「其他」字符應該返回一個詞位呢?

    1熱度

    2回答

    我正在經歷在Appel的「ML中的現代編譯器實現」一書中生成Tiger Parser的Ch3編程練習。我的tiger.grm文件是here。我試圖診斷的錯誤是由一元和二元減算子的規則引起的減少 - 減少衝突。這裏是YACC錯誤: error: state 128: reduce/reduce conflict between rule 48 and rule 46 on OR error: st

    4熱度

    1回答

    通常在一個動態類型的編程語言中,對象struct有一個用於標識對象類型的標籤字段。 例如: struct myObject { int tag; ... } 所以很容易進行使用基於標籤領域的switch語句不同的動作。 例如: ​​ 在我的情況,而不是我使用了指向表示該對象的類一個void * isa指針整型標記字段。一切都很好,希望不要使用優雅的switch語句,我不得

    3熱度

    1回答

    讓我首先提出問題:我可以將實現此特定語法的解析樹簡單地轉換爲AST。 我被賦予此語法構建解析樹: literal := INTEGER | FLOAT | TRUE | FALSE . designator := IDENTIFIER { "[" expression0 "]" } . op0 := ">=" | "<=" | "!=" | "==" | ">" | "<" . op1

    2熱度

    1回答

    我有一個抽象語法樹,我需要將它轉換爲虛擬機的程序集。我不知道如何最好地做到這一點,所以我開始使用一串字符串模板。我的意思僞代碼示例,說需要編譯一個簡單的if語句有一個條件: std::string compile_if(Node* n) { std::string str = ""; curLabel = nLabels++; str += compile_com

    2熱度

    1回答

    我正在編寫一個編譯器,它接受我的AST並輸出OCaml AST。當編譯: (List.length '(1 2 3)) 到 List.length [1; 2; 3] 我得到以下輸出AST: [ structure_item (_none_[1,0+-1]..[1,0+-1]) ghost Pstr_eval expression (_none_[1,0+-1

    0熱度

    2回答

    我正在開發一個類似於Baysick的InternalDSL項目,用於構建編譯器。我理解代碼here的某些部分。在文件Baysick.scala中,有隱式函數,它們是獲取行號,賦值,符號等,並將它們饋送到相應的案例類中。 有人可以在這裏解釋我如何解析這個('dist := 100)表達式嗎?這裏使用了哪些隱式函數,以及它對應的case類是什麼。裏面發生了什麼? 而且,appendr()在這裏做什麼?

    0熱度

    1回答

    我在Flex和Bison中創建了一個計算器。我需要能夠打印來自標準輸入的任何表達式的前綴表示法。我能夠輕鬆打印修補後記號,但是我在做前綴記號時遇到了困難。以下是我在野牛迄今完成: %{ #include <math.h> #include <stdio.h> #include <stdlib.h> int yylex(void); void yyerror(char *); int

    0熱度

    1回答

    我被問到一個關於包含異步函數的函數的調用堆棧的有趣問題。 下面是一個例子: function test(a) { call_server(「www.awebsite.com/api」, a, callback);//async } 是什麼調用堆棧是什麼樣子?我的理解是: 推(測試) 推(一) 推(call_server) 然後: 彈出(call_server) 流行(一) 流行(

    6熱度

    1回答

    我想用C來寫一個緩衝區溢出鍛鍊學生。 通常堆棧幀由函數參數,返回地址,基指針和局部變量。但是我發現,有時候附加寄存器與基指針一起保存。我從課上記得,保存的Calee寄存器必須在使用之前保存。但是有些情況下編譯C代碼會產生彙編,這會毫無目的地顯式地保存和使用寄存器。請向我解釋這種行爲。 假設的主要功能 int main (int argc, char** argv) { func();