Parsing 语法糖的结果通常是什么?

Parsing 语法糖的结果通常是什么?,parsing,syntactic-sugar,Parsing,Syntactic Sugar,在哪一点上,句法分析通常被认为是句法分析还是后续步骤? 或者在哪一点上做得更好 假设表达式'array[index]'是表达式'get_元素(array,index)的语法糖 如果在解析过程中被识别,则“array[index]”的解析树与“get_element(array,index)”相同 如果在后面的步骤中识别,则“array[index]”的解析树与“get_element(array,index)”不同 tl;博士:@rici已经给出了一个简单的答案——我想从我自己构建解析器的经验中

在哪一点上,句法分析通常被认为是句法分析还是后续步骤? 或者在哪一点上做得更好

假设表达式
'array[index]'
是表达式
'get_元素(array,index)
的语法糖

  • 如果在解析过程中被识别,则“array[index]”的解析树与“get_element(array,index)”相同

  • 如果在后面的步骤中识别,则“array[index]”的解析树与“get_element(array,index)”不同


  • tl;博士:@rici已经给出了一个简单的答案——我想从我自己构建解析器的经验中进一步阐述一下

    我以前构建的解析器可以在一个步骤中直接从输入到AST。我不再那样做了,因为这最终是一场噩梦。太多不同的任务——字符串识别、错误报告、上下文相关约束、树构造——被粉碎在一起,解析器变得一团糟。测试和调试非常困难,进行更改也不好玩。另外,解析器和语法之间的对应关系(在我看来,这是基于语法的解析方法的一个非常有价值的特性)丢失了

    我目前的方法是构建与输入语法完全对应(希望如此)的解析器,并同时构建默认的CST(具体语法树)。是的,这意味着CST包含了“垃圾”——比如大括号和大括号——但这意味着解析器根本不需要进一步构建树

    然后,在稍后的状态中,CST被转换为AST。如果存在任何上下文相关的约束(例如对象文本中的唯一键),我将尝试在这里检查它们(并将它们排除在解析器之外)。这一步是“垃圾”(即大括号等具体语法)被丢弃的地方。在这一步中,我还将去除任何具体的语法糖——事实上,我对语法糖的定义是出现在具体语法中而不是抽象语法中的东西

    我注意到将我的混乱划分为各个步骤的好处是,解析代码更干净、更短、更具声明性,而且更模块化(这意味着我可以更改CST映射到AST的方式,而不必考虑解析代码)

    摘要:当从具体语法转换为抽象语法时,我删除了语法糖*,也就是说,语法糖根本不会出现在AST中



    *:你对句法糖的定义可能不同。

    tl;博士:@rici已经给出了一个简单的答案——我想从我自己构建解析器的经验中进一步阐述一下

    我以前构建的解析器可以在一个步骤中直接从输入到AST。我不再那样做了,因为这最终是一场噩梦。太多不同的任务——字符串识别、错误报告、上下文相关约束、树构造——被粉碎在一起,解析器变得一团糟。测试和调试非常困难,进行更改也不好玩。另外,解析器和语法之间的对应关系(在我看来,这是基于语法的解析方法的一个非常有价值的特性)丢失了

    我目前的方法是构建与输入语法完全对应(希望如此)的解析器,并同时构建默认的CST(具体语法树)。是的,这意味着CST包含了“垃圾”——比如大括号和大括号——但这意味着解析器根本不需要进一步构建树

    然后,在稍后的状态中,CST被转换为AST。如果存在任何上下文相关的约束(例如对象文本中的唯一键),我将尝试在这里检查它们(并将它们排除在解析器之外)。这一步是“垃圾”(即大括号等具体语法)被丢弃的地方。在这一步中,我还将去除任何具体的语法糖——事实上,我对语法糖的定义是出现在具体语法中而不是抽象语法中的东西

    我注意到将我的混乱划分为各个步骤的好处是,解析代码更干净、更短、更具声明性,而且更模块化(这意味着我可以更改CST映射到AST的方式,而不必考虑解析代码)

    摘要:当从具体语法转换为抽象语法时,我删除了语法糖*,也就是说,语法糖根本不会出现在AST中



    *:你对语法糖的定义可能不同。

    我怀疑是否有比“视情况而定”更好的答案,但在这种情况下,我会在语法分析中这样做。在许多情况下,树转换更为复杂,您应该稍后再进行。您是说“如果在解析过程中进行转换很简单-在解析过程中进行转换”?如果进行转换很简单,则不会影响生成良好的错误消息、调试信息或高级优化等。。。在极限中,您可以考虑编译是去汇编语言的,并且对于某些语言来说,有一个PASS编译器,在解析过程中增量地进行所有的编译。所以,正如我所说,这取决于。我怀疑是否有比“这取决于”更好的答案,但在这种情况下,我会在解析中这样做。在许多情况下,树转换更为复杂,您应该稍后再进行。您是说“如果在解析过程中进行转换很简单-在解析过程中进行转换”?如果进行转换很简单,则不会影响生成良好的错误消息、调试信息或高级优化等。。。在极限中,您可以考虑编译是去汇编语言的,并且对于某些语言来说,有一个PASS编译器,在解析过程中增量地进行所有的编译。所以,正如我所说的,这要视情况而定。