【问题标题】:How to parse complex function calls in custom language如何用自定义语言解析复杂的函数调用
【发布时间】:2012-06-17 22:51:58
【问题描述】:

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

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

【问题讨论】:

    标签: parsing programming-languages


    【解决方案1】:

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

    bison 支持 LR 系列中的自底向上解析器:LALR(1)、LR(1)、GLR(1) 和新的 IELR(1) 算法。它们涵盖了一大类语言,但您需要了解一些解析算法才能解决您可能遇到的一些错误(即移位/归约和归约/归约)。

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

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

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

    希望这会有所帮助!

    【讨论】:

    • +1 用于 IELR 参考。当老狗学会新把戏时,总是很好。
    • 在对 Bison、ANTRl、LL(*) 解析器等进行了大量谷歌搜索之后,似乎它们都适用于无上下文语法,我相当确定我的语言不是上下文免费,虽然我不太确定,因为我仍在努力破译所有这些维基百科页面......
    • @zacaj- 大多数编程语言都不是上下文无关的,但它们可以被认为是一种上下文无关的语言,具有一些额外的约束来表示范围等内容。你所描述的语言当然看起来与上下文无关,可以用这些算法进行解析。
    猜你喜欢
    • 2011-07-11
    • 2016-11-07
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 2016-10-20
    • 2013-09-20
    相关资源
    最近更新 更多