LEX 和 YACC实现计算器的设计思路和流程图
时间: 2024-02-27 12:53:03 浏览: 23
设计思路:
1. 定义文法:首先定义一个简单的四则运算文法,例如:
```
expr : expr '+' term
| expr '-' term
| term
term : term '*' factor
| term '/' factor
| factor
factor : '(' expr ')'
| NUM
```
2. 编写词法分析器(LEX):根据文法,定义词法规则,例如:
```
"+" return ADD;
"-" return SUB;
"*" return MUL;
"/" return DIV;
"(" return LPAREN;
")" return RPAREN;
[0-9]+ return NUM;
```
3. 编写语法分析器(YACC):根据文法,编写相应的语法规则,例如:
```
calc : expr
;
expr : expr ADD term
| expr SUB term
| term
;
term : term MUL factor
| term DIV factor
| factor
;
factor : LPAREN expr RPAREN
| NUM
;
```
4. 编写执行代码:根据语法规则,编写执行代码,例如:
```
int calc()
{
return expr();
}
int expr()
{
int left = term();
while (true) {
switch (yytoken) {
case ADD:
left += term();
break;
case SUB:
left -= term();
break;
default:
return left;
}
}
}
int term()
{
int left = factor();
while (true) {
switch (yytoken) {
case MUL:
left *= factor();
break;
case DIV:
left /= factor();
break;
default:
return left;
}
}
}
int factor()
{
int result;
switch (yytoken) {
case LPAREN:
yytoken = yylex();
result = expr();
if (yytoken != RPAREN) {
fprintf(stderr, "syntax error: expected ')'\n");
exit(1);
}
yytoken = yylex();
break;
case NUM:
result = atoi(yytext);
yytoken = yylex();
break;
default:
fprintf(stderr, "syntax error: expected number or '('\n");
exit(1);
}
return result;
}
```
流程图:
```
+----------------------+
| |
| calc() |
| |
+----------+-----------+
|
|
v
+----------+-----------+
| |
| expr() |
| |
+----------+-----------+
|
| ADD or SUB
v
+----------+-----------+
| |
| term() |
| |
+----------+-----------+
|
| MUL or DIV
v
+----------+-----------+
| |
| factor() |
| |
+----------+-----------+
|
| ( or NUM
v
+----------+-----------+
```