簡體   English   中英

如何用自定義語言解析復雜的函數調用

[英]How to parse complex function calls in custom language

我正在嘗試創建一種自定義的編程語言來娛樂,而我對函數調用所要支持的語法有些不滿。

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)被稱為

我已經將詞法分析器編程為:

  • 解釋函數聲明,處理范圍,處理文字等
  • 讀入常規代碼行,並列出每個標記,並在名稱中包含每個包含標記的所有函數的列表(如果有),識別標記是否為變量的名稱
  • 我還沒有處理流控制(if / goto),目前它們像正常函數一樣被處理

但是,現在我實際上需要弄清楚每行正在調用什么函數,按什么順序,用什么輸入以及什么輸出(o變量),而我遇到了一個障礙。 我對此沒有經驗,也不確定從哪里開始。 我知道我將需要某種遞歸函數。

基本上,任何人都可以告訴我我正在尋找哪種類型的算法,或者只是一些時髦的詞來開始谷歌搜索以了解更多信息? 我應該使用野牛還是antlr之類的東西,還是這種靈活/奇怪的語言太復雜了?

注意:我不使用Bison或Flex或其他任何東西,而是用C ++自己編寫所有代碼

如果要構建復雜的編程語言,則應強烈考慮使用諸如bison或ANTLR之類的解析器生成器來為您進行解析。 此類工具的優勢在於,您可以僅描述語言規則以及發現這些規則時的操作,該工具將自動為您生成解析代碼。

bison支持LR系列的自底向上解析器:LALR(1),LR(1),GLR(1)和新的IELR(1)算法。 這些捕獲了大量的語言,但是您需要了解一些有關解析算法的信息,以便解決您可能會遇到的一些錯誤(即,shift / reduce和reduce / reduce)。

ANTLR使用LL(*)解析器,該解析器捕獲的語言集略少一些,但在許多編程語言上都可以正常工作。

您的問題沒有正確的答案。 我會使用您覺得更舒適並具有正確語言輸出的任何工具。

如果您堅持要滾動自己的解析器,那么實際上可以手動實現上述算法,但這非常困難。 最簡單的選擇是使用具有回溯功能的自上而下的遞歸下降解析器,或者將語法微調到LL(1),然后使用簡單的自上而下的非回溯解析器。 就是說,我認為您正在使事情變得更加艱辛。

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM