首先了解这个语法制导翻译模式: 改写产生式: 调整翻译模式: 举例说明分析树: 实现代码(完全是对照上分析树而写的递归代码): #include <ctype.h> #include <stdio.h> #include <stdlib.h> int lookahead; /*声明函数*/ expr(); term(); rest(); match(int); error(); int main() { lookahead = getchar(); expr(); return 0; } int expr() { term(); rest(); return 0; } int term() { if(isdigit(lookahead)) { putchar(lookahead); match(lookahead); } else error(); return 0; } int match(int t) { if(lookahead == t) lookahead = getchar(); else error(); return 0; } int error() { printf("systax error/n"); exit(1); return 0; } int rest() { if(lookahead == '+') { match('+'); term(); putchar('+'); rest(); } else if(lookahead == '-') { match('-'); term(); putchar('-'); rest(); } else; return 0; } 可以优化一下: #include <ctype.h> #include <stdio.h> #include <stdlib.h> int lookahead; expr(); term(); match(int); error(); int main() { lookahead = getchar(); expr(); putchar('/n'); return (0); } int expr() { term(); while(1) { if(lookahead == '+') { match('+'); term(); putchar('+'); } else if(lookahead == '-') { match('-'); term(); putchar('-'); } else break; } return 0; } int term() { if(isdigit(lookahead)) { putchar(lookahead); match(lookahead); } else error(); return 0; } int match(int t) { if(lookahead == t) lookahead = getchar(); else error(); return 0; } int error() { printf("systax error/n"); exit(1); return 0; } this is the simplest