惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
博客园_首页
宝玉的分享
宝玉的分享
S
SegmentFault 最新的问题
Jina AI
Jina AI
Hugging Face - Blog
Hugging Face - Blog
V
Visual Studio Blog
美团技术团队
IT之家
IT之家
罗磊的独立博客
Blog — PlanetScale
Blog — PlanetScale
Google DeepMind News
Google DeepMind News
月光博客
月光博客
Microsoft Azure Blog
Microsoft Azure Blog
H
Help Net Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Last Week in AI
Last Week in AI
博客园 - 叶小钗
M
MIT News - Artificial intelligence
B
Blog RSS Feed
有赞技术团队
有赞技术团队
Y
Y Combinator Blog

卡瓦邦噶!

服务器高性能网络调优 | 卡瓦邦噶! 为何写作 | 卡瓦邦噶! 读《金阁寺》 | 卡瓦邦噶! 雨季又来 | 卡瓦邦噶! MTU Probe 引起的初始延迟 | 卡瓦邦噶! 3.5 秒的固定延迟问题 | 卡瓦邦噶! 学习网络的一点经验 | 卡瓦邦噶! ARP 问题诊断 | 卡瓦邦噶! 网络断断续续…… | 卡瓦邦噶! Piccolo P2P 镜像分发 | 卡瓦邦噶! 一起看电影 | 卡瓦邦噶! 《征服C指针》 | 卡瓦邦噶! 我的姥姥 | 卡瓦邦噶! WordPress网站迁移方案 Python的哲学 Python 3.5的新特性 学校不教的计算机课 垃圾回收(GC)的三种基本方式 在编程中体验纯粹的快乐 从《美丽新世界》谈自由 在快钱实习 迷人的嗓音和迷人的故事——《Sleepyhead》 Python 的十个自然语言处理工具 记一个愚蠢的bug 一年炉石传说的游戏体验 《以撒的结合:重生》网页版图鉴 分清 C++的指针、引用和数组 笑话三则 自由比皇帝更伟大——《悲惨世界》笔记 Git 10 周年访谈:Linus 讲述背后故事
一个词法分析器的简单实现
laixintao · 2015-03-31 · via 卡瓦邦噶!

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

#include<stdio.h>

#include<string.h>

#include<iostream>

using namespace std;

#define WORD_LENGTH 130 // 单词最大长度

#define WORD_OF_PROGRAM 1000 //最大单词数

char prog[WORD_OF_PROGRAM*WORD_LENGTH],token[WORD_LENGTH];

char ch;

int syn,p,m=0,n,row;

double sum =0;   //类型为整数或者小数的时候,用于保存源数据

int syn_of_rwtab; //遍历关键字数组

int locate_line; //单词在行中的位置

char *rwtab[18]={"program","const","var","integer",

        "decimal","string","procedure","begin",

        "end ","if","then","else","while","do",

        "call","read","write","not"}; //保存关键字

void getToken(){

    /*

     这里一共有7类,每一类都有一个if判断

    */

    for(n=0;n<WORD_LENGTH;n++) token[n]=NULL;

    ch=prog[p++];

//****************第6类 分隔符***********************************//

    if(ch==' '||ch==';'||

       ch=='{'||ch=='}'||

       ch=='('||ch==')'){

            syn = 6;

        token[0] = ch;

    }

//***************2 标识符 1 关键字*********************************//

    else if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||ch=='_')  //可能是标示符或者变量名

    {

        m=0;

        while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||ch=='_')

        {

            token[m++]=ch;

            ch=prog[p++];

        }

        token[m++]='\0';

        p--;

        syn=2;

        for(n=0;n<18;n++)  //将识别出来的字符和已定义的标示符作比较,

            if(strcmp(token,rwtab[n])==0)

            {

                syn=1;

                syn_of_rwtab=n;

                break;

            }

    }

//*****************3 整数 4小数********************************//

    else if((ch>='0'&&ch<='9'))

    {

            bool flag = false; //是否是小数

            sum=0;

            while((ch>='0'&&ch<='9'))

            {

                sum=sum*10+ch-'0';

                ch=prog[p++];

            }

            if(ch=='.'){

                flag = true;

                ch=prog[p++];

                double tag = 0.1; //记录小数的位数

                while((ch>='0' && ch<='9')){

                    sum+=(ch-'0')*tag;

                    tag=tag*0.1;

                    ch=prog[p++];

                }

            }//if

        p--;

        if(flag) syn = 4;

        else syn = 3;

        if(sum>32767)

            syn=-1;

    }

//********************5 判断是不是字符串****************************//

    else if(ch=='\"'){

        syn = 5;

        m=0;

        token[m++] = ch;

        while((ch=prog[p++])!='\"')

            token[m++] = ch;

        token[m] = ch;

       // p--;

    }

//*******************7 运算符*******************//

    else switch(ch)

    {

        case'<':

            m=0;

            token[m++]=ch;

            ch=prog[p++];

            if(ch=='>')

            {

                syn=7;

                token[m++]=ch;

            }

            else if(ch=='=')

            {

                syn=7;

                token[m++]=ch;

            }

            else

            {

                syn=7;

                p--;

            }

            break;

        case'>':

            m=0;

            token[m++]=ch;

            ch=prog[p++];

            if(ch=='=')

            {

                syn=7;

                token[m++]=ch;

            }

            else

            {

                syn=7;

                p--;

            }

            break;

        case':':

            m=0;token[m++]=ch;

            ch=prog[p++];

            if(ch=='=')

            {

                syn=7;

                token[m++]=ch;

            }

            else

            {

                syn=7;

                p--;

            }

            break;

        case'*':syn=7;token[0]=ch;break;

        case'/':syn=7;token[0]=ch;break;

        case'+':syn=7;token[0]=ch;break;

        case'-':syn=7;token[0]=ch;break;

        case'=':syn=7;token[0]=ch;break;

        case'#':syn=0;token[0]=ch;break;

        case'\n':syn=-2;locate_line=0;break;

        default: syn=-1;break;

    }

}

int main()

{

    p=0;

    row=1;

    cout<<"Please input string:"<<endl;

    do

    {

        cin.get(ch);

        prog[p++]=ch;

    }

    while(ch!='#');

    int temp = 0; //不区分大小写,全部转换成小写。

    while(prog[temp]!='#'){

        if(prog[temp]<='Z' && prog[temp]>='A')

            prog[temp]+='a'-'A';

        temp++;

    }

    p=0;

    do

    {

        getToken();

        locate_line++;

        switch(syn)

        {

        case 1: cout<<row<<" "<<locate_line<<" "<<"("<<syn<<","<<rwtab[syn_of_rwtab]<<")"<<endl;break;

        case 2: cout<<row<<" "<<locate_line<<" "<<"("<<syn<<","<<token<<")"<<endl; break;

        case 5: cout<<row<<" "<<locate_line<<" "<<"("<<syn<<","<<token<<")"<<endl; break;

        case 6: cout<<row<<" "<<locate_line<<" "<<"("<<syn<<","<<token[0]<<")"<<endl; break;

        case 3: cout<<row<<" "<<locate_line<<" "<<"("<<syn<<","<<sum<<")"<<endl; break;

        case 4: cout<<row<<" "<<locate_line<<" "<<"("<<syn<<","<<sum<<")"<<endl; break;

        case -1: cout<<"Error in row "<<row<<"!"<<endl; break;

        case -2: row=row++;break;

        }

    }

    while (syn!=0);

}