我正在尝试创建一种有趣的自定义编程语言,但我对我想要通过函数调用支持的语法有点忘乎所以。
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”时,timesToPrint 在 getNumberFrom (int) into o( int) 被称为
我已经将词法分析器编程为:
- 解释函数声明、处理范围、处理文字等
- 阅读常规代码行并列出每个标记,以及名称中包含每个标记的所有函数的列表(如果有的话),识别标记是否是变量的名称
- 我还没有处理流控制(if/goto),它们目前被视为普通函数
但是,现在我需要真正弄清楚每行调用的函数、顺序、输入以及输出(o 变量),我遇到了一些障碍. 我没有这方面的经验,我不知道从哪里开始。我知道我需要某种递归函数。
基本上,谁能告诉我我正在寻找什么类型的算法,或者只是一些流行语来开始谷歌搜索以了解更多信息?我应该使用 bison 还是 antlr 或其他什么,或者这种灵活/奇怪的语言会不会太复杂?
注意:我没有使用 Bison 或 Flex 或其他任何东西,我自己用 C++ 编写所有代码