一个能够进行语法分析并生成三地址代码的微型编译程序
时间: 2024-03-03 20:52:42 浏览: 168
下面是一个简单的微型编译程序,支持语法分析和生成三地址代码的功能。
1. 给定文法
我们考虑一个简单的算术表达式文法,包括加法、减法、乘法和除法四种运算符。该文法如下:
```
<expr> -> <term> { (+|-) <term> }
<term> -> <factor> { (*|/) <factor> }
<factor> -> id | num | '(' <expr> ')'
```
其中,id代表变量名,num代表数值。
2. 消除左递归,提取左因子
消除左递归后的文法如下:
```
<expr> -> <term> <expr_tail>
<expr_tail> -> + <term> <expr_tail> | - <term> <expr_tail> | ε
<term> -> <factor> <term_tail>
<term_tail> -> * <factor> <term_tail> | / <factor> <term_tail> | ε
<factor> -> id | num | '(' <expr> ')'
```
其中,ε表示空串。
3. 编制并化简语法图
语法图如下:
```
<expr>
|
<term> <expr_tail>
|
<factor> <term_tail> <expr_tail>
|
id | num | '(' <expr> ')' <term_tail> <expr_tail>
|
* <factor> <term_tail> <expr_tail> | / <factor> <term_tail> <expr_tail> | ε <term_tail> <expr_tail>
|
+ <term> <expr_tail> | - <term> <expr_tail> | ε
```
进一步简化后的语法图如下:
```
<expr>
|
<term> <expr_tail>
|
<factor> <term_tail>
|
id | num | '(' <expr> ')' <term_tail>
|
* <factor> <term_tail> | / <factor> <term_tail> | ε
|
+ <term> <expr_tail> | - <term> <expr_tail> | ε
|
+ <term> <expr_tail> | - <term> <expr_tail> | ε
```
4. 编制各个递归子程序的算法
下面是各个递归子程序的算法:
- expr():分析表达式,并生成三地址代码。
```
<expr> -> <term> <expr_tail>
```
```
expr() {
term();
expr_tail();
}
```
- expr_tail():分析表达式的尾部,并生成三地址代码。
```
<expr_tail> -> + <term> <expr_tail> | - <term> <expr_tail> | ε
```
```
expr_tail() {
if (lookahead == '+') {
match('+');
term();
emit('ADD', arg1, arg2, result);
expr_tail();
} else if (lookahead == '-') {
match('-');
term();
emit('SUB', arg1, arg2, result);
expr_tail();
} else {
// ε
}
}
```
- term():分析项,并生成三地址代码。
```
<term> -> <factor> <term_tail>
```
```
term() {
factor();
term_tail();
}
```
- term_tail():分析项的尾部,并生成三地址代码。
```
<term_tail> -> * <factor> <term_tail> | / <factor> <term_tail> | ε
```
```
term_tail() {
if (lookahead == '*') {
match('*');
factor();
emit('MUL', arg1, arg2, result);
term_tail();
} else if (lookahead == '/') {
match('/');
factor();
emit('DIV', arg1, arg2, result);
term_tail();
} else {
// ε
}
}
```
- factor():分析因子,并生成三地址代码。
```
<factor> -> id | num | '(' <expr> ')'
```
```
factor() {
if (lookahead == id || lookahead == num) {
match(lookahead);
emit('MOV', arg1, null, result);
} else if (lookahead == '(') {
match('(');
expr();
match(')');
} else {
error();
}
}
```
5. 编制各个递归子程序的函数
下面是各个递归子程序的函数:
```
// 词法分析函数
int scan() {
// ...
}
// 匹配函数
void match(int token) {
if (lookahead == token) {
lookahead = scan();
} else {
error();
}
}
// 错误处理函数
void error() {
// ...
}
// 生成三地址代码函数
void emit(char* op, char* arg1, char* arg2, char* result) {
// ...
}
// expr()函数
void expr() {
term();
expr_tail();
}
// expr_tail()函数
void expr_tail() {
if (lookahead == '+') {
match('+');
term();
emit('ADD', arg1, arg2, result);
expr_tail();
} else if (lookahead == '-') {
match('-');
term();
emit('SUB', arg1, arg2, result);
expr_tail();
} else {
// ε
}
}
// term()函数
void term() {
factor();
term_tail();
}
// term_tail()函数
void term_tail() {
if (lookahead == '*') {
match('*');
factor();
emit('MUL', arg1, arg2, result);
term_tail();
} else if (lookahead == '/') {
match('/');
factor();
emit('DIV', arg1, arg2, result);
term_tail();
} else {
// ε
}
}
// factor()函数
void factor() {
if (lookahead == id || lookahead == num) {
match(lookahead);
emit('MOV', arg1, null, result);
} else if (lookahead == '(') {
match('(');
expr();
match(')');
} else {
error();
}
}
```
6. 三地址代码生成的数据结构和算法
三地址代码可以用一个四元组(op, arg1, arg2, result)来表示,其中op表示运算符,arg1和
阅读全文