[英]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
希望您能對我要做的事情有一個基本的了解。 更加具體,
我已經將詞法分析器編程為:
但是,現在我實際上需要弄清楚每行正在調用什么函數,按什么順序,用什么輸入以及什么輸出(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.