Architecture 管道和过滤器体系结构
我正在阅读面向模式的软件体系结构中的管道和过滤器体系结构模式。在这里,我不必知道编译器设计,但作者给出了编译器设计的示例。大部分内容我都听懂了,但我很难理解 在编译器设计中,我们有不同的阶段,如扫描器、解析器、语义分析、中间代码生成和后端(MIPS后端、英特尔后端…) 在这里,作者提到了前端阶段,如解析器、语义分析、中间代码生成。后端是MIPS后端 下面是文本片段 我们决定不显式地构造抽象语法树,将其从解析器传递到语义分析器。相反,我们将对语义分析器(sa)和代码生成器(cg)的调用嵌入到yacc的语法规则中:Architecture 管道和过滤器体系结构,architecture,semantic-analysis,Architecture,Semantic Analysis,我正在阅读面向模式的软件体系结构中的管道和过滤器体系结构模式。在这里,我不必知道编译器设计,但作者给出了编译器设计的示例。大部分内容我都听懂了,但我很难理解 在编译器设计中,我们有不同的阶段,如扫描器、解析器、语义分析、中间代码生成和后端(MIPS后端、英特尔后端…) 在这里,作者提到了前端阶段,如解析器、语义分析、中间代码生成。后端是MIPS后端 下面是文本片段 我们决定不显式地构造抽象语法树,将其从解析器传递到语义分析器。相反,我们将对语义分析器(sa)和代码生成器(cg)的调用嵌入到yac
addexpr : team
| addexpr '+' term
{ sa.checkCompat($1,$3); cg.genAdd($1,$3);}
| addexpr '-' term
{ sa.checkCompat($1,$3); cg.genSub($1,$3);}
我对上述文本的问题
1.作者所说的“不明确地构造抽象树”是什么意思?
2.我只需要理解上面的语法规则它在做什么?因为我不是在设计语言,所以我必须理解模式。若我对上面的例子有很好的理解,我能有效地遵循这个模式吗
感谢您的时间和帮助。这个例子看起来像是来自yacc-lex/bison-flex这样的词法分析器的语法规则。像您描述的规则一样,是一种分层语法规则,例如 您发布的“代码”告诉一种称为“addexpr”的表达式的语法规则 这是这样写的: 添加表达式是一个术语或另一个添加表达式+术语或另一个添加表达式-术语 您可以使用这些递归语法规则来构建语言表示。代码
{sa.checkCompat($1,$3);cg.genAdd($1,$3);}
看起来像是在对$1和$3进行输入验证,如参数1和3所示,其中在“X+Y”中,$1将是“X”、$2='+'和$3='Y'。
对cg.genAdd
的调用可能是一个函数调用,它向抽象语法树中添加了一个“add”表达式
这意味着您在解析源代码时,一次生成一个元素的抽象语法树 我相信@MortenJensen回答了你的第一个问题 如果您进行了一些web开发,可能您已经知道管道是什么。想象一下,您的请求是在web服务器上处理的。有一行独立的模块解析它们的输入(这是一行中前一个模块的输出),最后一个模块生成输出http响应。(tcp包被转换为http请求,http请求被转换为服务器对象,请求被解析,响应服务器对象被创建,对象被呈现为html,html被包装为http响应,http响应被包装为tcp包)
编译器也是如此。它获取您的源代码,经过几次后续转换后,您将获得一个可执行文件。这是管道模式的一个很好的例子,但可能没有这样的细节可以分散你对主要问题的注意力。我认为Morten Jensen回答了关于语法解释的问题。此外 我猜:
- sa.checkCompat指的是-语义分析器,检查 两个操作数的兼容性
- genAdd是指-代码生成器,生成代码以添加两个操作数
addexpr := term | addexpr + term | addexpr - term