2017-05-14 31 views
-4
這個邏輯

考慮一個假想的編程語言規則如下:我如何用C

每個函數使用關鍵字「BEGIN」開始,那麼它的名字 每個函數結束時,必須有關鍵字「結束」。

要調用一個函數,關鍵字「CALL」就在函數的名稱前面使用。關鍵字「EXECUTE」意思是:「在沒有另一個函數的幫助下做一些工作」。

「完成」這個詞不是我們在這項任務中所關心的! 程序總是以行開始:「BEGIN Main」。

假設針對上述規則編寫了一些代碼,並將其存儲在名爲「code.prog」的文件中。在該文件中,還假設在每行的開始處存在「行號」。

編寫一個讀取此代碼(code.prog)的C程序,並用行號打印執行結果。 對於這個工作,你應該爲函數調用創建一堆行號。因此,另外,爲每個「函數調用」和「函數結束」打印棧的內容。

EXAMPLE 
code.prg // this is the file 
1 BEGIN Fun1 
2 CALL Fun2 
3 EXECUTE 
4 END 
5 BEGIN Fun2 
6 EXECUTE 
7 END 
8 BEGIN Main 
9 EXECUTE 
10 CALL Fun1 
11 END 

輸出代碼:

Execution Order of Lines: 
8  
9  
10 Stack = 10 
1  
2 Stack = 2 10 
5  
6  
7 Stack = 10 
3  
4 Stack =  
11 --- END --- 
+1

這不是一個編程競賽網站,您可以給出問題並解決用戶問題。有許多教程和在線編程競賽網站可用。嘗試一下,如果你在某些部分出現錯誤,那麼回來後我們會盡力解決這個錯誤。 –

+0

like [this](http://ideone.com/QotaSJ) – BLUEPIXY

回答

1

你應該知道的編程語言是如何解析和執行。 如果您需要更深入的信息,我建議您閱讀Peter Van Roy的「計算機編程的概念,模型和技巧」。

您的編程語言是由語法,語義和語用構成的。您的作業文本描述了您的編程語言的語法規則(語法)。這些規則對於用您的語言編寫有效的句子很有用。 有效的句子可以被您的解釋器理解,然後執行。 在執行過程中,基本上爲每個句子分配一個語義。

這些步驟如下:

  1. 寫一個標記。你的編程語言的每個單詞都是一個令牌。 BEGIN是一個令牌,CALL是一個令牌,函數名稱也是令牌(函數標識符)。標記器分析您的源代碼(這是一個簡單的字符串)並創建一個標記列表。 Text files -> [TOKENIZER] -> sequence of token
  2. 編寫一個解析器。句子由單詞組成,那麼類似地,你的P.L句子將由令牌組成。你應該使用你的語法規則來知道哪個令牌序列是有效的,哪些不是。例如。函數必須以令牌BEGIN開頭,然後是identifier令牌,後跟一個或多個instruction令牌,並以END令牌結束。您必須創建一個解析樹https://en.wikipedia.org/wiki/Parse_tree)。分析樹的節點是非終結符符號,樹葉是終結符符號(令牌)。 Sequence of token -> [PARSER] -> Parse tree
  3. 寫一個口譯員。是時候爲每個符號分配語義:從解析樹的根部開始,解釋器分析執行相關指令的每個節點。

實現:

標記生成器和分析器都只是有限狀態機。 解釋器基本上是一個程序,用於轉換執行堆棧中的一個分析樹,每個指令都從其中移出並執行。