• 词法分析(编译原理不用慌)


    目录

    一.简单版

    二.简单版(文本保存)

    c++版

    运行结果:

     Java版

    运行结果:

    三.第三版(文本保存)

    c++版

    运行结果:


    一.简单版

    1. #include
    2. #include
    3. using namespace std;
    4. #include
    5. //char prog[80]="begin if x>=24 then s:=0 end #"
    6. char prog[80];
    7. char token[8]; //prog存放输入符号串;token存放识别出的单词
    8. int syn, p, sum,m;
    9. char ch; //syn-种别码;p-prog数组的下标;sum-识别出的整数
    10. char *rwtab[6] = {"begin", "if", "then", "while", "do", "end"}; //关键字表置初值
    11. //扫描子程序
    12. void scaner( )
    13. {
    14. m=0;
    15. for (int n=0; n<8; n++ ) token[n]=NULL; //将token清空
    16. ch=prog[p++] ; //根据全局变量p读取下一个字符,分析下一个单词
    17. while (ch==' '|| ch == '\n') ch=prog[p++] ;
    18. //1.首字符为字母的情况,可能为标识符或关键字
    19. if(ch<='z'&& ch>='a')
    20. { m=0;
    21. while (ch<='z'&& ch>='a'||ch<='9'&& ch>='0')
    22. {
    23. token[m++]=ch;//将ch保存至token[m++]中
    24. ch=prog[p++] ;//读取下一个字符
    25. }
    26. token[m++]='\0';
    27. p--;//......
    28. syn=10 ; //标识符,置syn=10
    29. for (int n=0; n<6; n++ ) //判断当前标识符是否为关键字
    30. if (strcmp( token, rwtab[n])==0)
    31. {
    32. syn=n+1;//关键字,置关键字syn
    33. break ;
    34. }
    35. }
    36. //2.首字符为数字的情况,为整数
    37. else if (ch<='9'&& ch>='0')
    38. {
    39. while (ch<='9'&& ch>='0')
    40. {
    41. sum=sum*10+ch-'0'; //将ch数字字符转换成整数送入sum,进位故sum*10,
    42. ch=prog[p++] ;//读取下一个字符
    43. }
    44. p--;//.......
    45. syn=11; //整数,置syn=11
    46. }
    47. //3.其他算符或界符等情况
    48. else
    49. switch(ch)
    50. {
    51. case '<':
    52. token[m++]=ch; //ch存入token ;
    53. ch=prog[p++] ;// 读下一个字符 ;
    54. //三种情况,<=或<>或<
    55. if (ch=='>')
    56. {
    57. syn=21;//将<>的种别码赋给syn;
    58. token[p++]=ch; //ch存入token ;
    59. }
    60. else if (ch=='=')
    61. {
    62. syn=22;//将<=的种别码赋给syn;
    63. token[p++]=ch; // ch存入token ;
    64. }
    65. else {
    66. syn=20;//将<的种别码赋给syn;
    67. p--;
    68. }
    69. break;
    70. case '>':
    71. token[m++]=ch; ch=prog[p++] ;// 读下一个字符 ;
    72. if (ch=='=')
    73. {
    74. syn=24;//将<=的种别码赋给syn;
    75. token[m++]=ch; // ch存入token ;
    76. }
    77. else {
    78. syn=23;//将<的种别码赋给syn;
    79. p--;
    80. }
    81. break;
    82. case ':':
    83. token[m++]=ch; //ch存入token ;
    84. ch=prog[p++] ;// 读下一个字符 ;
    85. if (ch=='=')
    86. {
    87. syn=18;//将<=的种别码赋给syn;
    88. token[m++]=ch; // ch存入token ;
    89. }
    90. else {
    91. syn=17;//将<的种别码赋给syn;
    92. p--;
    93. }
    94. break;
    95. case '+':
    96. token[m++]=ch;syn=13;break;
    97. case '-':
    98. token[m++]=ch;syn=14;break;
    99. case '*':
    100. token[m++]=ch;syn=15;break;
    101. case '/':
    102. token[m++]=ch;syn=16;break;
    103. case '=':
    104. token[m++]=ch;syn=25;break;
    105. case ';':
    106. token[m++]=ch;syn=26;break;
    107. case '(':
    108. token[m++]=ch;syn=27;break;
    109. case ')':
    110. token[m++]=ch;syn=28;break;
    111. case '#':
    112. token[m++]=ch;syn=0;break;
    113. default: syn= -1;
    114. }
    115. token[m++]='\0';
    116. }
    117. int main( ){
    118. //......
    119. printf( "\n please input string : \n" ) ;
    120. do{
    121. ch=getchar( );
    122. prog[p++]=ch ;
    123. } while(ch!='#');
    124. p=0;//......
    125. do{ //循环调用scanner()函数分析prog中的字符串,直到syn为0(即#)分析结束
    126. scaner();
    127. switch(syn){
    128. case 11: //根据syn的值输出(syn,sum或者token)二元组
    129. printf("%-6d %-5d\n",sum,syn);break;
    130. default: printf("%-6s %-5d\n",token,syn);
    131. }
    132. }while(syn!=0);
    133. }

    二.简单版(文本保存)

    c++版

    此处是自己先创建一个1.txt文件

    如:

    const    a=10;
    var    b,c;
    procedure    p;
          begin
        c:=b+a
          end;
    begin#
     

    1. #include
    2. #include
    3. //"begin if x>24 then s:=0 end #"
    4. char prog[80], token[10]; //prog存放输入符号串;token存放识别出的单词
    5. int syn, p, sum=0,m;
    6. char ch; //syn-种别码;p-prog数组的下标;sum-识别出的整数
    7. char str;
    8. char *rwtab[13] = {"begin", "if", "then", "while", "do", "end","const","var","procedure","odd","call","read","write"};//关键字表置初值
    9. FILE* pf = fopen("2.txt", "w+");
    10. //扫描子程序
    11. void scaner( )
    12. {
    13. m=0;sum=0;
    14. for (int n=0; n<8; n++ ) token[n]=NULL; //将token清空
    15. ch=prog[p++] ; //根据全局变量p读取下一个字符,分析下一个单词
    16. while (ch==' '|| ch == '\n') ch=prog[p++] ;
    17. //1.首字符为字母的情况,可能为标识符或关键字
    18. if(ch<='z'&& ch>='a')
    19. { m=0;
    20. while (ch<='z'&& ch>='a'||ch<='9'&& ch>='0')
    21. {
    22. token[m++]=ch;//将ch保存至token[m++]中
    23. ch=prog[p++] ;//读取下一个字符
    24. }
    25. token[m++]='\0';
    26. p--;//......
    27. syn=30 ; //标识符,置syn=30
    28. for (int n=0; n<13; n++ ) //判断当前标识符是否为关键字
    29. if (strcmp( token, rwtab[n])==0)
    30. {
    31. syn=n+1;//关键字,置关键字syn
    32. break ;
    33. }
    34. }
    35. //2.首字符为数字的情况,为整数
    36. else if (ch<='9'&& ch>='0')
    37. {
    38. while (ch<='9'&& ch>='0')
    39. {
    40. sum=sum*10+ch-'0'; //将ch数字字符转换成整数送入sum
    41. ch=prog[p++] ;//读取下一个字符
    42. }
    43. p--;//.......
    44. syn=31; //整数,置syn=31
    45. }
    46. //3.其他算符或界符等情况
    47. else
    48. switch(ch)
    49. {
    50. case '<':
    51. token[m++]=ch; //ch存入token ;
    52. ch=prog[p++] ;// 读下一个字符 ;
    53. //三种情况,<=或<>或<
    54. if (ch=='>')
    55. {
    56. syn=21;//将<>的种别码赋给syn;
    57. token[m++]=ch; //ch存入token ;
    58. }
    59. else if (ch=='=')
    60. {
    61. syn=22;//将<=的种别码赋给syn;
    62. token[p++]=ch; // ch存入token ;
    63. }
    64. else {
    65. syn=20;//将<的种别码赋给syn;
    66. p--;
    67. }
    68. break;
    69. case '>':
    70. token[m++]=ch; ch=prog[p++] ;// 读下一个字符 ;
    71. if (ch=='=')
    72. {
    73. syn=24;//将<=的种别码赋给syn;
    74. token[p++]=ch; // ch存入token ;
    75. }
    76. else {
    77. syn=23;//将<的种别码赋给syn;
    78. p--;
    79. }
    80. break;
    81. case ':':
    82. token[m++]=ch; //ch存入token ;
    83. ch=prog[p++] ;// 读下一个字符 ;
    84. if (ch=='=')
    85. {
    86. syn=18;//将:=的种别码赋给syn;
    87. token[m++]=ch; // ch存入token ;
    88. }
    89. else {
    90. syn=17;//将:的种别码赋给syn;
    91. p--;
    92. }
    93. break;
    94. case '+':
    95. token[m++]=ch;syn=32;break;
    96. case '-':
    97. token[m++]=ch;syn=14;break;
    98. case '*':
    99. token[m++]=ch;syn=15;break;
    100. case '/':
    101. token[m++]=ch;syn=16;break;
    102. case '=':
    103. token[m++]=ch;syn=25;break;
    104. case ';':
    105. token[m++]=ch;syn=26;break;
    106. case '(':
    107. token[m++]=ch;syn=27;break;
    108. case ')':
    109. token[m++]=ch;syn=28;break;
    110. case '#':
    111. token[m++]=ch;syn=0;break;
    112. default: syn= -1;
    113. }
    114. token[m++]='\0';
    115. }
    116. int f(int syn){
    117. if(syn==26||syn==27||syn==28){
    118. printf("界符");
    119. fprintf(pf," 界符\n");
    120. }else if((syn>=20&&syn<=25)||(syn>=14&&syn<=16)||syn==18||syn==32){
    121. printf("运算符");
    122. fprintf(pf," 运算符\n");
    123. }else if(syn>=1&&syn<=13){
    124. printf("关键字");
    125. fprintf(pf," 关键字\n");
    126. }else if(syn==30){
    127. printf("标识符");
    128. fprintf(pf," 标识符\n");
    129. }else if(syn==17){
    130. printf("非法");
    131. fprintf(pf," 非法\n");
    132. }
    133. }
    134. int main( ){
    135. p=0;
    136. FILE* pf1 = fopen("1.txt", "r");
    137. while((str=fgetc(pf1))!=EOF)
    138. { //如果没有读到末尾,则继续读取信息
    139. prog[p++]=str;
    140. if(str=='#'){
    141. break;
    142. }
    143. }
    144. prog[p++]='\0';
    145. p=0;
    146. do{ //循环调用scanner()函数分析prog中的字符串,直到syn为0(即#)分析结束
    147. scaner();
    148. switch(syn){
    149. case 31: //根据syn的值输出(syn,sum或者token)二元组
    150. fprintf(pf,"%-6d ",sum);
    151. fprintf(pf," 数字\n");
    152. printf("%-6d 数字\n",sum);
    153. break;
    154. default: {
    155. fprintf(pf,"%-6s ",token);
    156. printf("%-6s ",token);f(syn);printf("\n");
    157. }
    158. }
    159. }while(syn!=0);
    160. fclose(pf);//关闭文件
    161. pf=NULL;
    162. // fclose(pf1);
    163. // pf1=NULL;
    164. }

    运行结果:

     

     Java版

     

     1.txt放你要读的文法

    1. import java.io.FileInputStream;
    2. import java.io.FileNotFoundException;
    3. import java.io.FileOutputStream;
    4. import java.io.IOException;
    5. import java.nio.charset.StandardCharsets;
    6. import java.util.Scanner;
    7. /*
    8. * 保留字13个syn赋值1-13const ,var,procedure,begin,end,odd,if,then,call, while,do, read,write
    9. * 标识符syn赋值14
    10. * 常数syn赋值
    11. * 运算符+,-,*,/,= syn赋值16-20 #syn赋值为0 <,<=,>,>=,:= syn赋值21-25
    12. * 界符( ) , ; . syn赋值26-30
    13. * */
    14. public class PL0 {
    15. static String prog="";
    16. //static String prog="begin if x>=24 then s:=0 end #";
    17. static String token1; //做保留识别出的值
    18. static int syn; //种别码
    19. static int p=0; //做索引
    20. static int sum; //做常数
    21. static char ch; //做字符串索引下取值
    22. static String str=" "; //做写入txt中分隔
    23. //13个关键字
    24. static String[] rwtab = {"const" ,"var","procedure","begin","end","odd",
    25. "if","then","call", "while","do", "read","write"};
    26. static void scaner()
    27. {
    28. token1=""; //将token1清空
    29. sum=0; //sum清空
    30. ch=prog.charAt(p++) ; //读字符串p索引下
    31. while (ch==' '|| ch == '\n') ch=prog.charAt(p++) ;
    32. //1.首字符为字母的情况,可能为标识符或关键字
    33. if(ch<='z'&& ch>='a')
    34. {
    35. while (ch<='z'&& ch>='a'||ch<='9'&& ch>='0')
    36. {
    37. token1+=ch;
    38. ch=prog.charAt(p++) ;//读取下一个字符
    39. }
    40. p--;
    41. syn=14 ; //标识符,置syn=14
    42. for (int n=0; n<13; n++ ) //判断当前标识符是否为关键字
    43. if (token1.equals(rwtab[n]) )
    44. {
    45. syn=n+1;
    46. break ;
    47. }
    48. }
    49. //2.首字符为数字的情况,为整数
    50. else if (ch<='9'&& ch>='0')
    51. {
    52. while (ch<='9'&& ch>='0')
    53. {
    54. sum=sum*10+ch-'0'; //将ch数字字符转换成整数送入sum,进位故sum*10,
    55. ch=prog.charAt(p++) ;//读取下一个字符
    56. }
    57. p--;
    58. syn=15; //常数,置syn=15
    59. }
    60. //3.其他算符或界符等情况
    61. else
    62. switch(ch)
    63. {
    64. case '+':
    65. token1+=ch;syn=16;break;
    66. case '-':
    67. token1+=ch;syn=17;break;
    68. case '*':
    69. token1+=ch;syn=18;break;
    70. case '/':
    71. token1+=ch;syn=19;break;
    72. case '=':
    73. token1+=ch;syn=20;break;
    74. case '#':
    75. token1+=ch;syn=0;break;
    76. //<与<=
    77. case '<':
    78. token1+=ch;
    79. ch=prog.charAt(p++) ;
    80. if (ch=='=')
    81. {
    82. syn=22;
    83. token1+=ch;
    84. }else{
    85. syn=21;
    86. p--;
    87. }
    88. break;
    89. //>与>=
    90. case '>':
    91. token1+=ch; ch=prog.charAt(p++) ;// 读下一个字符 ;
    92. if (ch=='=')
    93. {
    94. syn=24;
    95. token1+=ch;
    96. }
    97. else {
    98. syn=23;
    99. p--;
    100. }
    101. break;
    102. case ':':
    103. token1+=ch;
    104. ch=prog.charAt(p++) ;
    105. if (ch=='=')
    106. {
    107. syn=25;
    108. token1+=ch;
    109. }
    110. break;
    111. case '(':
    112. token1+=ch;syn=26;break;
    113. case ')':
    114. token1+=ch;syn=27;break;
    115. case ',':
    116. token1+=ch;syn=28;break;
    117. case ';':
    118. token1+=ch;syn=29;break;
    119. case '.':
    120. token1+=ch;syn=30;break;
    121. default: syn= -1;
    122. }
    123. }
    124. public static void main(String[] args) throws IOException {
    125. //System.out.print("please input string :");
    126. //Scanner input = new Scanner(System.in);
    127. //prog=input.nextLine();
    128. FileInputStream fos0;
    129. FileOutputStream fos1;
    130. FileOutputStream fos2;
    131. FileOutputStream fos3;
    132. FileOutputStream fos4;
    133. FileOutputStream fos5;
    134. try {
    135. fos0=new FileInputStream("src/1.txt");
    136. int ch=0;
    137. while ((ch=fos0.read())!=-1){
    138. prog+=(char)ch;
    139. }
    140. System.out.println(prog);
    141. fos0.close();
    142. fos1=new FileOutputStream("src/关键字.txt",true);
    143. fos2=new FileOutputStream("src/标识符.txt",true);
    144. fos3=new FileOutputStream("src/运算符.txt",true);
    145. fos4=new FileOutputStream("src/常数.txt",true);
    146. fos5=new FileOutputStream("src/界符.txt",true);
    147. } catch (FileNotFoundException e) {
    148. throw new RuntimeException(e);
    149. }
    150. do{ //循环调用scanner()函数分析prog中的字符串,直到syn为0(即#)分析结束
    151. scaner();
    152. if(token1!="") {
    153. //System.out.println(token1+" "+syn);
    154. System.out.printf("%-8s",token1+" ");
    155. }
    156. //关键字1-13
    157. if(syn>=1&&syn<=13){
    158. fos1.write((token1+str+"\n").getBytes(StandardCharsets.UTF_8));
    159. System.out.println("基本字");
    160. }
    161. //标识符14
    162. else if(syn==14){
    163. fos2.write((token1+str+"\n").getBytes(StandardCharsets.UTF_8));
    164. System.out.println("标识符");
    165. }
    166. //运算符16-25和#0
    167. else if(syn>=16&&syn<=25||syn==0){
    168. fos3.write((token1+str+"\n").getBytes(StandardCharsets.UTF_8));
    169. System.out.println("运算符");
    170. }
    171. //常数15
    172. else if(syn==15){
    173. fos4.write((String.valueOf(sum)+str+"\n").getBytes(StandardCharsets.UTF_8));
    174. //System.out.println(sum+" "+syn);
    175. System.out.printf("%-8d",sum);
    176. System.out.println("数字");
    177. } else {
    178. fos5.write((token1+str+"\n").getBytes(StandardCharsets.UTF_8));
    179. System.out.println("界符");
    180. }
    181. }while(syn!=0);
    182. fos0.close();
    183. fos1.close();
    184. fos2.close();
    185. fos3.close();
    186. fos4.close();
    187. fos5.close();
    188. }
    189. }

    运行结果:

     

    三.第三版(文本保存)

    c++版

    1. #include
    2. #include
    3. enum symbol {
    4. nul, ident, number, plus, minus,
    5. times, slash, oddsym, eql, neq,
    6. lss, leq, gtr, geq, lparen,
    7. rparen, comma, semicolon, period, becomes,
    8. beginsym, endsym, ifsym, thensym, whilesym,
    9. writesym, readsym, dosym, callsym, constsym,
    10. varsym, procsym,
    11. };
    12. int cc, ll;
    13. FILE * fa1;
    14. int err; /*错误计数器*/
    15. FILE* fin;
    16. int cx;
    17. char ch;
    18. char line[81];
    19. #define getchdo if(-1==getch())return -1
    20. # define al 10
    21. char a[al + 1];
    22. char id[al + 1];
    23. # define norw 13
    24. char word[norw][al];
    25. enum symbol sym;
    26. enum symbol wsym[norw];
    27. # define nmax 14
    28. int num;
    29. enum symbol ssym[256];
    30. char fname[al];
    31. void init();
    32. void error(int n);
    33. int getch();
    34. int getsym();
    35. int main()
    36. {
    37. printf("Input pl/0 file?");
    38. scanf("%s", fname); /* 输入PL/0源程序文件名 */
    39. fin = fopen(fname, "r");
    40. if(fin)
    41. {
    42. printf("Output pl/0 file?");
    43. scanf("%s", fname);
    44. fa1 = fopen(fname, "w");
    45. init();
    46. // err = 0;
    47. // cc = cx = ll = 0;
    48. // ch = ' ';
    49. while(getsym() != -1);
    50. }
    51. else
    52. {
    53. printf("找不到文件\n");
    54. }
    55. printf("\n");
    56. return 0;
    57. }
    58. void init()
    59. {
    60. int i;
    61. /* 设置单字符符号 */
    62. for(i=0; i<=255; i++)
    63. {
    64. ssym[i] = nul;
    65. }
    66. ssym['+'] = plus;
    67. ssym['-'] = minus;
    68. ssym['*'] = times;
    69. ssym['/'] = slash;
    70. ssym['('] = lparen;
    71. ssym[')'] = rparen;
    72. ssym['='] = eql;
    73. ssym[','] = comma;
    74. ssym['.'] = period;
    75. ssym['#'] = neq;
    76. ssym[';'] = semicolon;
    77. /* 设置保留字名字,按照字母顺序,便于折半查找 */
    78. strcpy(word[0], "begin");
    79. strcpy(word[1], "call");
    80. strcpy(word[2], "const");
    81. strcpy(word[3], "do");
    82. strcpy(word[4], "end");
    83. strcpy(word[5], "if");
    84. strcpy(word[6], "odd");
    85. strcpy(word[7], "procedure");
    86. strcpy(word[8], "read");
    87. strcpy(word[9], "then");
    88. strcpy(word[10], "var");
    89. strcpy(word[11], "while");
    90. strcpy(word[12], "write");
    91. /* 设置保留字符号 */
    92. wsym[0] = beginsym;
    93. wsym[1] = callsym;
    94. wsym[2] = constsym;
    95. wsym[3] = dosym;
    96. wsym[4] = endsym;
    97. wsym[5] = ifsym;
    98. wsym[6] = oddsym;
    99. wsym[7] = procsym;
    100. wsym[8] = readsym;
    101. wsym[9] = thensym;
    102. wsym[10] = varsym;
    103. wsym[11] = whilesym;
    104. wsym[12] = writesym;
    105. }
    106. /*
    107. * 出错处理,打印出错位置和错误编码
    108. */
    109. void error(int n)
    110. {
    111. char space[81];
    112. memset(space,32,81);
    113. space[cc-1] = 0; //出错时当前符号已经读完,所以cc-1
    114. printf("****%s!%d\n",space,n);
    115. fprintf(fa1,"****%s!%d\n",space,n);
    116. err++;
    117. }
    118. /*
    119. * 漏掉空格,读取一个字符。
    120. *
    121. * 每次读一行,存入line缓冲区,line被getsym取空后再读一行
    122. *
    123. * 被函数getsym调用。
    124. */
    125. int getch()
    126. {
    127. if(cc==ll)
    128. {
    129. if(feof(fin))
    130. {
    131. printf("program incomplete");
    132. return -1;
    133. }
    134. ll=0;
    135. cc=0;
    136. ch = ' ';
    137. while(ch != 10)
    138. {
    139. if(EOF == fscanf(fin,"%c",&ch))
    140. {
    141. line[ll]=0;
    142. break;
    143. }
    144. //fprintf(fa1,"%c", ch);
    145. line[ll]=ch;
    146. ll++;
    147. }
    148. }
    149. ch = line[cc];
    150. cc++;
    151. return 0;
    152. }
    153. /*
    154. * 词法分析,获取一个符号
    155. */
    156. int getsym()
    157. {
    158. int i,j,k;
    159. if(ch=='#'){
    160. return -1;
    161. }
    162. while(ch==' ' || ch==10 || ch==9) /* 忽略空格、换行和TAB */
    163. {
    164. getchdo;
    165. }
    166. if(ch>='a' && ch<='z')
    167. { /* 名字或保留字以a~z开头*/
    168. k = 0;
    169. do{
    170. if(k
    171. {
    172. a[k]=ch;
    173. k++;
    174. }
    175. getchdo;
    176. }while(ch>='a'&&ch<='z' || ch>='0'&&ch<='9');
    177. a[k] = 0;
    178. strcpy(id,a);
    179. i=0;
    180. j=norw-1;
    181. do{ /* 搜索当前符号是否为保留字 */
    182. k=(i+j)/2;
    183. if(strcmp(id,word[k]) <= 0)
    184. {
    185. j=k-1;
    186. }
    187. if(strcmp(id,word[k]) >= 0)
    188. {
    189. i=k+1;
    190. }
    191. }while(i<=j);
    192. if(i-1>j)
    193. {
    194. printf("%s 保留字\n", id);
    195. fprintf(fa1,"%s 保留字\n", id);
    196. sym=wsym[k];
    197. }
    198. else
    199. {
    200. printf("%s 标识符\n", id);
    201. fprintf(fa1,"%s 标识符\n", id);
    202. sym=ident; /* 搜索失败,则是名字或数字 */
    203. }
    204. }
    205. else
    206. {
    207. if(ch>='0'&&ch<='9')
    208. { /* 检测是否为数字:以0~9开头 */
    209. k=0;
    210. num=0;
    211. sym=number;
    212. do{
    213. //printf("%c\n",ch);
    214. num=10*num+ch-'0';
    215. k++;
    216. getchdo;
    217. }while(ch>='0'&&ch<='9'); /* 获取数字的值 */
    218. k--;
    219. if(k>nmax)
    220. {
    221. error(30);
    222. }
    223. printf("%d 整数\n",num);
    224. fprintf(fa1,"%d 整数\n", num);
    225. }
    226. else
    227. {
    228. if(ch==':') /* 检测赋值符号 */
    229. {
    230. getchdo;
    231. if(ch=='=')
    232. {
    233. printf(":= 运算符\n");
    234. fprintf(fa1,":= 运算符\n", id);
    235. sym=becomes;
    236. getchdo;
    237. }
    238. else
    239. {
    240. printf(": error\n");
    241. sym=nul; /* 不能识别的符号 */
    242. }
    243. }
    244. else
    245. {
    246. if(ch=='<') /* 检测小于或小于等于符号 */
    247. {
    248. getchdo;
    249. if(ch=='=')
    250. {
    251. printf("<= 运算符\n");
    252. fprintf(fa1,"<= 运算符\n", id);
    253. sym=leq;
    254. getchdo;
    255. }
    256. else
    257. {
    258. printf("< 运算符\n");
    259. fprintf(fa1,"< 运算符\n", id);
    260. sym=lss;
    261. }
    262. }
    263. else
    264. {
    265. if(ch=='>') /* 检测大于或大于等于符号 */
    266. {
    267. getchdo;
    268. if(ch=='=')
    269. {
    270. printf(">= 运算符\n");
    271. fprintf(fa1,">= 运算符\n", id);
    272. sym=geq;
    273. getchdo;
    274. }
    275. else
    276. {
    277. printf("> 运算符\n");
    278. fprintf(fa1,"> 运算符\n", id);
    279. sym=gtr;
    280. }
    281. }
    282. else
    283. {
    284. if(ch=='=')
    285. {
    286. printf("= 运算符\n");
    287. fprintf(fa1,"= 运算符\n", id);
    288. //getchdo;
    289. }
    290. if(ch=='+')
    291. {
    292. printf("+ 运算符\n");
    293. fprintf(fa1,"+ 运算符\n", id);
    294. getchdo;
    295. }
    296. else if(ch=='-')
    297. {
    298. printf("- 运算符\n");
    299. fprintf(fa1,"- 运算符\n", id);
    300. getchdo;
    301. }
    302. else if(ch=='*')
    303. {
    304. printf("* 运算符\n");
    305. fprintf(fa1,"* 运算符\n", id);
    306. getchdo;
    307. }
    308. else if(ch=='/')
    309. {
    310. printf("/ 运算符\n");
    311. fprintf(fa1,"/ 运算符\n", id);
    312. getchdo;
    313. }
    314. else if(ch=='(')
    315. {
    316. printf("( 运算符\n");
    317. fprintf(fa1,"( 运算符\n", id);
    318. getchdo;
    319. }
    320. else if(ch==')')
    321. {
    322. printf(") 运算符\n");
    323. fprintf(fa1,") 运算符\n", id);
    324. getchdo;
    325. }
    326. else if(ch==',')
    327. {
    328. printf(", 运算符\n");
    329. fprintf(fa1,", 运算符\n", id);
    330. getchdo;
    331. }
    332. else if(ch==';')
    333. {
    334. printf("; 运算符\n");
    335. fprintf(fa1,"; 运算符\n", id);
    336. getchdo;
    337. }
    338. else if(ch=='.')
    339. {
    340. printf(". 运算符\n");
    341. fprintf(fa1,". 运算符\n", id);
    342. getchdo;
    343. }
    344. else
    345. {
    346. sym=ssym[ch]; /* 当符号不满足上述条件时,全部按照单字符符号处理 */
    347. if(sym != period)
    348. {
    349. getchdo;
    350. }
    351. }
    352. }
    353. }
    354. }
    355. }
    356. }
    357. return 0;
    358. }

    运行结果:

  • 相关阅读:
    开源的滚滚浪潮:近年来开源多样化的几大亮点
    关于自定义 HttpServletRequestWrapper 后续读不到参数的问题
    20年上海站D题Walker(二分,简洁)
    c语言使用fdk_aac库对aac音频解码为pcm
    Python工程师Java之路(h)Java字符串拼接+null拼接处理
    spring---第四篇
    前端设计模式之【迭代器模式】
    [KALI] 开启ssh远程连接
    spring:详解spring MVC
    docker-compose
  • 原文地址:https://blog.csdn.net/qq_58631644/article/details/128128416