作为一个辅助项目和学习实验,我正在编写自己的编程语言,没有额外的预制工具,比如LLVM。
我已经编写了自己的递归下降解析器,但我在尝试解析这样的语句时遇到了一个问题:
x()()[0]()
我想不出一个好的方法来创建一个解析树/AST。我试过阅读其他编程语言(特别是Python和C#)的语法,但我就是弄不明白它们是如何做到的。
我该如何写一些东西来解析上面的语法呢?
发布于 2017-10-19 10:03:48
从AST的角度来看,假设您有某种“函数调用”节点,其中一个子节点表示要调用的函数的表达式,每个表达式一个子节点表示一个参数,这可能会有所帮助。例如,代码fn()()[0]()
可能如下所示:
+--------+
| call |
+--------+
function / \ args
/ (null)
/
+-----------+
| selection |
+-----------+
array / \ index
/ 0
/
+--------+
| call |
+--------+
function / \ args
/ (null)
/
+--------+
| call |
+--------+
function / \ args
fn 0
关于如何解析这样的东西,我建议将函数调用视为像数组选择(arr[index]
)或成员选择(object.field
)那样的后缀运算符。此代码的CFG片段可能如下所示:
Expr --> Expr(ArgList) |
/* other expression types */
从递归下降的角度来看,在解析了一个表达式之后,您可以进行一个先行检查,看看后面是否有一个开括号标记。如果是这样的话,这意味着您刚刚读取的内容应该被视为函数调用表达式的函数组件,而您将要读取的是参数列表。
https://stackoverflow.com/questions/46814797
复制相似问题