语法制导翻译是干什么的?

从语法分析到语义分析,通俗的讲一下,语法知道翻译是做什么的?语法制导翻译,这六个字代表什么意思。?谢谢大家。
关注者
47
被浏览
2481
龙书第2版第5章把语法制导翻译讲得很明白了。

语法制导翻译,Syntax-directed translation,简称SDT。
意思是在解析(parse)输入的字符串时,在特定位置执行指定的动作;换言之,根据语法把输入的字符串“翻译”为一串动作,故名“语法制导翻译”。
“特定位置”是通过把“指定动作”(称为语义动作,semantic action)嵌入到语法规则中指定的。

例如,如果有下述语法:
E -> NUM + NUM
那么一个嵌入了语义动作的语法制导定义可以是:
E -> NUM + { println("found op plus"); } NUM { println("value = " + ($1.value + $4.value)); }
这个例子中用花括号包围的代码就是语义动作,而其位置指定了在parse到什么地方的时候要执行该语义动作。例如第一组语义动作位于"+"之后、第二个NUM之前,那么parse到这个"+"之后就要执行这个语义动作。

语义动作可以看作一个“epsilon匹配”或者叫“空串匹配”,也就是说它在语法中的作用可以看作一个匹配空串的位置,也就是总是会匹配上。
E -> NUM + ACTION1 NUM ACTION2
像这样。

一个完整的例子可以参考 bison的运算符优先级一例,四则混合运算计算器,经典案例。