Javascript 除了左\右递归,还可以在语法中定义运算符关联性吗
声明: 要编写正确表示运算符关联性的语法,请执行以下操作:Javascript 除了左\右递归,还可以在语法中定义运算符关联性吗,javascript,parsing,recursion,ecmascript-6,compiler-construction,Javascript,Parsing,Recursion,Ecmascript 6,Compiler Construction,声明: 要编写正确表示运算符关联性的语法,请执行以下操作: 对于左关联性,使用左递归 对于右结合性, 使用右递归 左递归语法是在语法级别控制关联性的唯一方法,对吗 这里提到的另一种方法是结合性和优先级声明: %left + %left * 据我所知,它们是在实际的解析器级实现上实现的 但是,LL解析器无法处理左递归语法。因此,如果我想实现递归下降解析器,我需要在实现中以某种方式解决它。对吗 实现递归下降解析器的作者提到: 递归下降解析器可以解析不包含 左递归。但是,原始ECMAScript
- 对于左关联性,使用左递归李>
- 对于右结合性, 使用右递归
%left +
%left *
据我所知,它们是在实际的解析器级实现上实现的
但是,LL解析器无法处理左递归语法。因此,如果我想实现递归下降解析器,我需要在实现中以某种方式解决它。对吗
实现递归下降解析器的作者提到:
递归下降解析器可以解析不包含
左递归。但是,原始ECMAScript语法包含
一堆左递归,对于递归函数来说会很麻烦
下降分析器。开始解析器的第一步是转换
通过消除左递归实现语法,就像我在这里所做的那样
值得注意的是,消除
左递归也会破坏运算符的关联性,但我将处理
以后再谈
是的,没错。@Bergi,谢谢你帮我学习编译器!在递归下降语法中处理左联想运算符并不特别困难;看见该技术包括(a)将尾部递归重写为循环,(b)动态重写解析树(尽管重写几乎不明显)。但是,真的没有必要:LR解析器生成器很容易获得,可以为您完成所有工作,让您专注于更有趣的事情(比如解析输入的语义处理:编译、静态分析、漂亮的打印等等)。@rici,谢谢,我正在尝试对TypeScript编译器进行反向工程,这就是我关注自顶向下解析器的原因是的,没错。@Bergi,谢谢你帮助我学习编译器!在递归下降语法中处理左联想运算符并不特别困难;看见该技术包括(a)将尾部递归重写为循环,(b)动态重写解析树(尽管重写几乎不明显)。但是,真的没有必要:LR解析器生成器很容易获得,可以为您完成所有工作,让您专注于更有趣的事情(比如解析输入的语义处理:编译、静态分析、漂亮的打印等等)。@rici,谢谢,我正在尝试对TypeScript编译器进行反向工程,这就是我关注自顶向下解析器的原因