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编译器进行反向工程,这就是我关注自顶向下解析器的原因