如何用自定义语言解析复杂的函数调用

时间:2012-06-14 20:39:09

标签: parsing programming-languages

我正在尝试创建一个有趣的自定义编程语言,并且我已经对我希望通过函数调用支持的语法感到厌烦。

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)变为o( int)被称为

我已经将词法分析器编程为:

  • 解释函数声明,处理范围,处理文字等
  • 读入常规代码行并制作每个令牌的列表,以及包含其名称中每个令牌的所有函数的列表(如果有的话),识别令牌是否是变量的名称
  • 我还没有处理流量控制(if / goto),它们目前被视为正常功能

但是,现在我需要实际确定每行调用的函数,按顺序,使用什么输入,以及输出(o变量),并且我已经达到了一点点路障。我对此没有经验,我不知道从哪里开始。我知道我需要某种递归功能。

基本上,任何人都可以告诉我我正在寻找什么类型的算法,或者只是一些流行语来开始谷歌搜索以了解更多信息?我应该使用bison或antlr或其他什么,或者这种灵活/奇怪的语言会变得太复杂吗?

注意:我没有使用Bison或Flex或其他任何东西,我自己用C ++编写所有代码

1 个答案:

答案 0 :(得分:1)

如果您正在构建复杂的编程语言,那么您应该强烈考虑使用像bison或ANTLR这样的解析器生成器来为您进行解析。这些工具的优点是您可以只描述您的语言规则,以及找到此类规则时的操作,该工具将自动为您生成解析代码。

bison支持LR系列中的自下而上解析器:LALR(1),LR(1),GLR(1)和新的IELR(1)算法。这些捕获了大量语言,但您需要了解一些解析算法,以便修复您可能遇到的一些错误(即shift / reduce和reduce / reduce)。

ANTLR使用LL(*)解析器,它捕获的语言略少,但在许多编程语言中都可以很好地工作。

你的问题没有一个正确的答案。我会使用你感觉更舒服的任何工具并且具有正确的语言输出。

如果您坚持使用自己的解析器,那么您可以手动实现上述算法,但这非常困难。最简单的选择是使用带有回溯的自上而下的递归下降解析器,或者将语法微动直到LL(1),然后使用简单的自上而下的非回溯解析器。也就是说,我认为你制造的东西比他们需要的要难得多。

希望这有帮助!