2011-04-16 48 views
0

我在大學時分配了一個奇怪的項目。我被要求從一個給定的輸入'C'程序中提取變量定義和引用。從'C'程序中提取變量定義和變量引用

輸入程序中的每一行在開頭都包含相應的行號,後面跟着一個空格,然後開始實際代碼。

考慮下面的程序..

1 int main() 
2 { 
3 int a,b,c; 
4 printf("Enter the values of a and b\n"); 
5 scanf("%d%d",&a,&b); 
6 c=a+b; 
7 printf("The sum of two numbers is %d",c); 
8 } 

而對於我正在開發的程序的輸入是一個「C」程序,其中單線由單個語句.. 即我們知道整個程序可以寫成一行。但不是在我的情況下,這是一旦有終止(分號),在分號後面的行被轉移到下一行..

無論如何,我的工作是提取變量定義/聲明和變量使用/引用在給定的輸入C程序中。

考慮上述程序, 在行號3中,變量a,b和c是聲明的,因此它必須打印在輸出的「definition」列下。

類似地,在語句5中,a和b的值正在使用scanf語句進行初始化,因此應該在輸出的定義列下打印變量a和b ..

現在考慮語句6,變量c的值正在被初始化/定義,因此c必須打印在定義列下。同時,a和b的值用於確定c ,因此變量a和b必須打印在輸出的「參考」列下。

最後,變量c的值在語句7中被引用/使用,因此變量c必須被打印被引用的列下..

該方案的示例輸出如下所示..

Line Number   Defined Variable  Referenced Variable 
_____________________________________________________________________ 
    1      --       -- 
    2      --       -- 
    3      a,b,c       -- 
    4      --       -- 
    5      a,b       -- 
    6      c       a,b 
    7      --       c 
    8      --       -- 

誰能告訴我如何解決這個問題? 請記住,我需要編寫一個C/C++程序,甚至允許shell腳本的項目.. 我需要考慮數學表達式,邏輯表達式,內置函數調用,用戶定義函數調用和函數定義。 。

在此先感謝..

+0

這是爲什麼類的?這個練習的目的是什麼? – 2011-04-16 12:46:26

+0

@ ab07:「這類事情發生在我們的大學裏」。你應該問「你(教授)期望我從這項任務中學到什麼」?如果他希望你用除真正的解析器以外的其他方法來做到這一點,我會不知道他的期望是什麼,以及是否有太多的指向。 5f他希望你用解析器來做,而且你不知道解析,你有麻煩。如果他希望你使用真正的解析器,我不明白左邊距中的數字的重點;你確定這是要求的一部分嗎? – 2011-04-16 12:50:45

+0

這是非常不精確的。你用'if'做什麼?你會跨多行傳播if語句嗎?那麼它會不會違反「單行包含單一陳述」的規則?你把它放在同一行,然後嵌套在複合語句中嵌套多個語句嗎?從而在同一行中有多個標量語句? – 2011-04-16 13:47:08

回答

1

標準的事情是寫一個標記和解析器部分編譯輸入程序。然後你就會知道每一行有什麼表達。對於這項任務的目的,你可以匹配正則表達式高達:

  1. 變量定義
  2. 變量引用

,並吐出捕獲每一行。因此,例如,變量引用可能類似於「除有效的C數據類型之外的任何地方有效的C標識符」。這裏的捕獲將是「一個有效的C標識符」,因此只需在「參考變量」列下打印出來。

+0

感謝您的答覆..但我怎麼能啓動?我應該使用C編程嗎?任何「Tokenizer和解析器」教程?你能指導我嗎? :) – abk07 2011-04-16 11:36:06

+0

@ abk07,如果這是**你的**任務,我假設你已經在學校/單元中教過解析器理論的基礎知識。如果情況並非如此,我覺得很奇怪你會得到這樣的任務。無論如何,Milimetric給你提供了一些必要的提示。我建議你在發佈後續問題之前,自己做一些研究(打開一本書,搜索網絡,不管)。 SO是回答特定問題的好地方,而不是牽扯他人來指導他們完成整個任務,IMO。這就是你的老師或你班上的TA所擅長的。祝你好運。 – 2011-04-16 11:58:48

+0

@Bart ..好的謝謝..這些事情發生在我們的大學.. – abk07 2011-04-16 12:02:40

1

您基本上需要從一個完整的C語法分析器開始。你可以自己寫這個,但是你最好使用預先存在的東西,比如CLang