我正在嘗試創建一種自定義編程語言以獲得更多樂趣,並且我已經習慣了使用函數調用支持的語法。如何解析自定義語言中的複雜函數調用
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爲IELR參考。當一隻老狗學習新的技巧時總是很好。 –
在做了大量關於Bison,ANTRl,LL(*)Parsers等的搜索引擎之後,似乎他們都使用無競爭語法,並且我相當肯定我的語言不是上下文無關的,儘管我不是相當肯定,因爲我仍在努力破譯所有這些維基百科頁面...... – zacaj
@ zacaj-大多數編程語言不是上下文無關的,但是它們可以被認爲是一種上下文無關的語言,其中有一些額外的約束表示諸如範圍界定等等。你所描述的語言當然看起來沒有上下文,足以用這些算法進行分析。 – templatetypedef