提问人:Abdelfattah Radwan 提问时间:9/15/2023 更新时间:9/16/2023 访问量:70
在递归下降解析器中区分 Lambda 参数列表和分组表达式
Discriminating between a Lambda Parameter List and a Grouping Expression in a Recursive Descent Parser
问:
我正在为我正在从事的一个项目编写一种小型脚本语言。我为它编写了一个简单的递归下降解析器(类似于 Crafting Interpreters 中的解析器)。我想添加对 lambda(匿名函数)表达式的支持,并赋予它们以下语法:
let some_func = (param1, param2 = 1) {
return param1 + param2
}
如何区分 lambda 的参数列表和分组(括号)表达式,如下所示,例如:
let some_expr = (var1 = 0) // Assignment is allowed as an expression.
let some_func = (param1, param2 = 0) {
return param1 + param2
}
答:
1赞
sepp2k
9/16/2023
#1
像这样的 Lambda 语法(即直接以参数列表开头的 lambda 语法,而不是表示 lambda 的某个关键字或符号)不是 LL(k),这意味着您不能使用有限量的 lookahead 来解析它。
换句话说,您不能像 LL(1) 语法那样只打开当前标记,也不能像 LL(k) 语法那样使用表单条件。if
tokens.lookAhead(0).kind == X && tokens.lookAhead(1).kind == Y && ... && tokens.lookAhead(k).kind == Z
相反,您的选择是使用无限展望来查看是否存在 after 或使用回溯,即尝试解析 lambda,如果解析失败,则继续下一个优先级(仍然是当前令牌)。{
)
(
评论
0赞
Abdelfattah Radwan
9/16/2023
我一直在思考这个问题,想知道检查表达式中的逗号是否是一个很好的解决方案。我认为这就像检查表情后面是否有大括号一样。
0赞
sepp2k
9/16/2023
@AbdelfattahRadwan 如果只有一个参数()怎么办?(x) {}
0赞
Abdelfattah Radwan
9/16/2023
哦,对了。这完全超出了我的脑海。好吧,那我就用你的解决方案。谢谢!
评论