首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解析多个调用的语法?

解析多个调用的语法?
EN

Stack Overflow用户
提问于 2017-10-19 00:20:31
回答 1查看 50关注 0票数 1

作为一个辅助项目和学习实验,我正在编写自己的编程语言,没有额外的预制工具,比如LLVM。

我已经编写了自己的递归下降解析器,但我在尝试解析这样的语句时遇到了一个问题:

代码语言:javascript
运行
复制
x()()[0]()

我想不出一个好的方法来创建一个解析树/AST。我试过阅读其他编程语言(特别是Python和C#)的语法,但我就是弄不明白它们是如何做到的。

我该如何写一些东西来解析上面的语法呢?

EN

回答 1

Stack Overflow用户

发布于 2017-10-19 10:03:48

从AST的角度来看,假设您有某种“函数调用”节点,其中一个子节点表示要调用的函数的表达式,每个表达式一个子节点表示一个参数,这可能会有所帮助。例如,代码fn()()[0]()可能如下所示:

代码语言:javascript
运行
复制
                   +--------+
                   |  call  |
                   +--------+
              function /  \ args
                      /  (null)
                     /
                +-----------+
                | selection |
                +-----------+
               array /  \ index
                    /    0
                   /
              +--------+
              |  call  |
              +--------+
         function / \ args
                 /   (null)     
                /
           +--------+
           |  call  |
           +--------+
     function / \ args
            fn   0

关于如何解析这样的东西,我建议将函数调用视为像数组选择(arr[index])或成员选择(object.field)那样的后缀运算符。此代码的CFG片段可能如下所示:

代码语言:javascript
运行
复制
 Expr --> Expr(ArgList) |  
          /* other expression types */

从递归下降的角度来看,在解析了一个表达式之后,您可以进行一个先行检查,看看后面是否有一个开括号标记。如果是这样的话,这意味着您刚刚读取的内容应该被视为函数调用表达式的函数组件,而您将要读取的是参数列表。

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

https://stackoverflow.com/questions/46814797

复制
相关文章

相似问题

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