0

我正在尝试创建一种有趣的自定义编程语言,但我对我想要通过函数调用支持的语法有点忘乎所以。

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++ 编写所有代码

4

1 回答 1

1

如果您正在构建一种复杂的编程语言,您应该强烈考虑使用解析器生成器bison或 ANTLR 来为您进行解析。此类工具的优势在于,您只需描述您的语言的规则是什么,以及找到此类规则时该怎么做,该工具会自动为您生成解析代码。

bison支持 LR 系列中的自底向上解析器:LALR(1)、LR(1)、GLR(1) 和新的 IELR(1) 算法。这些捕获了大量语言,但您需要了解一些关于解析算法的知识,以便修复您可能遇到的一些错误(即移位/归约和归约/归约)。

ANTLR 使用 LL(*) 解析器,它捕获的语言集稍微少一些,但往往在许多编程语言上都能很好地工作。

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

如果你坚持滚动自己的解析器,那么你实际上可以手动实现上述算法,但这非常困难。最简单的选择是使用带回溯的自上而下递归下降解析器,或者调整语法直到它为 LL(1),然后使用简单的自上而下、非回溯解析器。也就是说,我认为你让事情变得比他们需要的要困难得多。

希望这可以帮助!

于 2012-06-14T20:45:09.367 回答