b哥吃周雨欣脚丫:求助:怎样为EBNF语法设计一个语法分析程序??

来源:百度文库 编辑:查人人中国名人网 时间:2024/05/01 18:18:07
怎样为EBNF语法设计一个语法分析程序??

要求:

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的相关知识哦~