b哥吃周雨欣脚丫:求助:怎样为EBNF语法设计一个语法分析程序??
来源:百度文库 编辑:查人人中国名人网 时间:2024/05/01 18:18:07
要求:
1读入1个双位数值合乎EBNF语法
例
double ::= [+|-] 数字 {数字} [. 数字 {数字}] [ (e|E) [+|-] 数字 {数字} ]
数字 ::= 0 . . . 9
2 当输入不规范数值时 给出出错提示
如何借助有限状态自动机DFA来做?
网上看有本《编译设计与开发技术》
其附录C. 3. 2 为EBNF语法设计一个语法分析程序
内容很相近
可超市却找不到这本书 那位大人能帮俺找下或指点迷津 小的感激不尽!!
#include "stdafx.h"
int main(void)
{
double x; //zusammengebaut ermittelt zahl
char c ; //Eingelesenes Zeichen
char zustand = 1; //aktueller Zustand des DEA
char vorzeichen = 1;//Vorzeichen der Zahl
//Eingabepromt
printf("Biite Zahl eingeben:");
//Schleifendurchlauf fuer jedes eingegebene Zeichen
while (1)
{
//Lesen des naechsten Zeichens
c = getchar();
//Verzweigung je nach Zustand des DEA
switch(zustand)
{
case 1:
//Anfangzustand:
// =>nur Vorzeichen oder Ziffer erlaubt
// - Vorzeichen =>Wechsel in Zustand 2
// - Ziffer =>Wechsel in Zustand 3
if (c =='+' || c == '-'//Vorzeichen
{
if (c == '-') vorzeichen = -1;
zustand = 2;
}
else if (c>='0' && c<='9') //Ziffer
{
x = c - '0';
zustand = 3;
}
else //unzulaessige Eingabe
goto error
break;
case 2:
// nur ZIffer nach vorhergem Vorzeichen erlaubt
// =>Wechsel in Zustand 3
if (c>='0' && c<='9') //Ziffer
{
x = c - '0';
zustand = 3;
}
else //unzulaessige Eingabe
goto error
break;
case 3:
//zulaessige Eingaben:
// - weitere Ziffern vor Dezimalpunkt /Exponenzialzeichen
// =>kein zustandswechsel
// - Dezimalpunkt =>Wechsel in zustand 4
// - Exponentialzeichen =>Wechsel in Zustand 6
// - Eingabeende(Enter-Taste) =>Verlassen des Automaten
if (c>='0' && c<='9') //weitere Ziffer
{
x = 10*x+c - '0';
}
else if (c =='.')//Dezimalpunkt
zustand 4;
else if (c == 'e'||c== 'E')// Exponenzialzeichen
zustand = 6;
else //Eingabe fertig
goto fertig;
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
break;
}
}
fertig: //Ende der Eingabe
//Vorzeichenbehandlung
x *= vorzeichen;
//Ausgabe der eingelesenen Zahl
printf("Die Zahl lautet: %e\n",x);
return 0;
//Fehlerbehandlung:
error:
printf(Syntaxfehler aufgetreten!\n");
return 8;
}
恰好我们也在学习DFA,觉得可以解决你的问题.
等下我给出程序.不过你要先学习一下DFA的相关知识哦~