首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用自定义语言解析复杂函数调用

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

Stack Overflow用户
提问于 2012-06-14 20:39:09
回答 1查看 152关注 0票数 0

为了好玩,我正在尝试创建一种定制的编程语言,我对函数调用支持的语法有点着迷。

代码语言:javascript
运行
复制
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

  • variables是‘声明’的,只要引用

  • 函数名就不能包含两个顺序的“名称标记”,每个名称令牌之间必须至少有一个参数(可能多个变量之间需要逗号,尽管我不想要求如果在变量前面不使用restriction)

  • putting o就可以管理解析,就可以使其成为‘输出’值。在这种情况下,函数在读取之前必须写入,并且在调用函数之前,变量不需要存在(在"getNumberFrom 4 In timesToPrint“中,timesToPrint在创建之前不存在,而getNumberFrom (int)到o(int)称为

)。

我已经编程让雷克萨斯:

  • 解释函数声明、处理作用域、处理文字等

但是,现在我需要知道每一行调用的函数是什么,按什么顺序调用,用什么输入,以及输出什么(o变量),我遇到了一些障碍。我没有这方面的经验,我也不知道从哪里开始。我知道我需要某种递归函数。

基本上,有人能告诉我我正在寻找的是哪种算法吗,或者仅仅是一些开始谷歌搜索以了解更多信息的热门词?我是否应该使用野牛或反式语言,还是这种灵活/奇怪的语言太复杂了?

注意:我没有使用Bison或Flex什么的,我是用C++编写所有代码的

EN

回答 1

Stack Overflow用户

发布于 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),然后使用一个简单的自顶向下的非回溯解析器。尽管如此,我认为你正在使事情变得比他们所需要的困难得多。

希望这能有所帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11041002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档