2012-06-14 52 views
0

我正在嘗試創建一種自定義編程語言以獲得更多樂趣,並且我已經習慣了使用函數調用支持的語法。如何解析自定義語言中的複雜函數調用

uses ConsoleIO 

r(int)success start (int) nArgument 
    printHelloWorlds 
    return 0 

printHelloWorld 
    print "Hello world\n" 

printHelloWorlds 
    getNumberFrom 4 into timesToPrint 
    timesPrinted = 0 
    printHelloWorld 
    timesPrinted = timesPrinted + 1 
    if timesPrinted < timesToPrint 
     goToLine 17 

getNumberFrom (int)number into o(int) out 
    name = "John" 
    out = 3 + name.findFirstOccurenceOf 'o' + number 

r(int) (string)str .findFirstOccurenceOf (char)c 
    //later 
    return 3 

希望你能得到我想要做的事情的基本概念。更具體地講,

  • 把R在作爲變量前使其返回值
  • 變量只是被引用
  • 函數名不能包含兩個連續的「名稱標記」「聲明」,每個名稱標記之間必須至少有一個參數(並且可能多個變量之間需要逗號,儘管如果我可以在沒有此限制的情況下管理解析)
  • 將o放在前面變量使其成爲「輸出」值。在這種情況下,函數必須在讀取之前寫入它,並且在函數被調用之前變量不需要存在(在「getNumberFrom 4 into timesToPrint」時,當getNumberFrom(int)創建爲o(在代碼的常規線路

    • 解釋函數聲明,處理範圍,處理文字等
    • 閱讀並製作一個列表:INT)被稱爲

    我已經編程的詞法分析器每個令牌的名稱,以及包含其名稱中每個令牌的所有函數的列表(如果有的話),識別令牌是否爲名稱可變

  • 我沒有處理流量控制(如果/ GOTO)的是,他們目前正在處理就像正常的功能

不過,現在我需要真正搞清楚什麼功能(S )每一行都在調用,按什麼順序,以及什麼輸入,以及什麼輸出(o變量),並且我碰到了一些路障。我沒有這方面的經驗,我不確定從哪裏開始。我知道我將需要某種遞歸函數。

基本上,任何人都可以告訴我什麼類型的算法,我正在尋找,或者只是一些流行語詞開始googling學習更多?我應該使用野牛或antlr或其他什麼,或者是一種語言,這種靈活/奇怪會過於複雜嗎?

注:我沒有使用野牛或Flex或任何東西,我寫的所有代碼自己在C++

回答

1

如果你正在構建一個複雜的編程語言,你應該認真考慮使用一個解析器生成像bison或ANTLR爲你解析。這些工具的優點在於,您可以只描述語言的規則,以及在找到這些規則時應該怎麼做,並且該工具會自動爲您生成解析代碼。 (1),LR(1),GLR(1)和新的IELR(1)算法支持LR家族中自下而上的解析器。它們捕獲了大量的語言,但爲了解決您可能遇到的一些錯誤(即移位/減少和減少/減少),您需要了解一些關於解析算法的信息。

ANTLR使用LL(*)解析器,它捕獲的語言稍小一些,但在許多編程語言上都可以很好地工作。

對於你的問題沒有一個正確的答案。我會使用你感覺更舒適的任何工具,並且有正確的語言輸出。

如果你堅持滾動你自己的解析器,那麼你實際上可以手工實現上述算法,但這是非常困難的。最簡單的選擇是使用帶有回溯的自頂向下遞歸下降解析器,或者直接調用LL(1),然後使用簡單的自頂向下非回溯解析器。也就是說,我認爲你正在讓事情變得比他們需要的更加困難。

希望這會有所幫助!

+0

+1爲IELR參考。當一隻老狗學習新的技巧時總是很好。 –

+0

在做了大量關於Bison,ANTRl,LL(*)Parsers等的搜索引擎之後,似乎他們都使用無競爭語法,並且我相當肯定我的語言不是上下文無關的,儘管我不是相當肯定,因爲我仍在努力破譯所有這些維基百科頁面...... – zacaj

+0

@ zacaj-大多數編程語言不是上下文無關的,但是它們可以被認爲是一種上下文無關的語言,其中有一些額外的約束表示諸如範圍界定等等。你所描述的語言當然看起來沒有上下文,足以用這些算法進行分析。 – templatetypedef