我正在尝试创建一个有趣的自定义编程语言,并且我已经对我希望通过函数调用支持的语法感到厌烦。
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变量),并且我已经达到了一点点路障。我对此没有经验,我不知道从哪里开始。我知道我需要某种递归功能。
基本上,任何人都可以告诉我我正在寻找什么类型的算法,或者只是一些流行语来开始谷歌搜索以了解更多信息?我应该使用bison或antlr或其他什么,或者这种灵活/奇怪的语言会变得太复杂吗?
注意:我没有使用Bison或Flex或其他任何东西,我自己用C ++编写所有代码
答案 0 :(得分:1)
如果您正在构建复杂的编程语言,那么您应该强烈考虑使用像bison
或ANTLR这样的解析器生成器来为您进行解析。这些工具的优点是您可以只描述您的语言规则,以及找到此类规则时的操作,该工具将自动为您生成解析代码。
bison
支持LR系列中的自下而上解析器:LALR(1),LR(1),GLR(1)和新的IELR(1)算法。这些捕获了大量语言,但您需要了解一些解析算法,以便修复您可能遇到的一些错误(即shift / reduce和reduce / reduce)。
ANTLR使用LL(*)解析器,它捕获的语言略少,但在许多编程语言中都可以很好地工作。
你的问题没有一个正确的答案。我会使用你感觉更舒服的任何工具并且具有正确的语言输出。
如果您坚持使用自己的解析器,那么您可以手动实现上述算法,但这非常困难。最简单的选择是使用带有回溯的自上而下的递归下降解析器,或者将语法微动直到LL(1),然后使用简单的自上而下的非回溯解析器。也就是说,我认为你制造的东西比他们需要的要难得多。
希望这有帮助!