为了好玩,我正在尝试创建一种定制的编程语言,我对函数调用支持的语法有点着迷。
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使其返回value
)。
我已经编程让雷克萨斯:
但是,现在我需要知道每一行调用的函数是什么,按什么顺序调用,用什么输入,以及输出什么(o变量),我遇到了一些障碍。我没有这方面的经验,我也不知道从哪里开始。我知道我需要某种递归函数。
基本上,有人能告诉我我正在寻找的是哪种算法吗,或者仅仅是一些开始谷歌搜索以了解更多信息的热门词?我是否应该使用野牛或反式语言,还是这种灵活/奇怪的语言太复杂了?
注意:我没有使用Bison或Flex什么的,我是用C++编写所有代码的
发布于 2012-06-14 20:45:09
如果您正在构建一种复杂的编程语言,则应该强烈考虑使用解析器生成器(如bison
或ANTLR )来为您进行解析。这些工具的优点是,您可以只描述语言的规则是什么,以及找到这些规则时应该做什么,该工具将自动为您生成解析代码。
bison
支持LR家族中的自下而上解析器: GLR(1)、LR(1)、GLR(1)和新的IELR(1)算法。这些语言捕获了大量的语言,但您需要了解一些解析算法,以便修复可能遇到的一些错误(即shift/reduce和reduce/reduce)。
ANTLR使用LL(*)解析器,它捕获了一组稍微小一点的语言,但在许多编程语言上工作得很好。
你的问题没有一个正确的答案。我会使用任何你觉得更舒服的工具,并有正确的语言输出。
如果您坚持使用自己的解析器,那么您实际上可以手工实现上述算法,但这是非常困难的。最简单的选择是使用带有回溯的自顶向下递归下降解析器,或者切换语法直到它是LL(1),然后使用一个简单的自顶向下的非回溯解析器。尽管如此,我认为你正在使事情变得比他们所需要的困难得多。
希望这能有所帮助!
https://stackoverflow.com/questions/11041002
复制相似问题