>
Java实现词法分析
2021-06-28 16:56
JAVA
  • 4562
  • 527
  • 64
  • 51

Java实现词法分析:

一、 实验目的

设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。

二、 实验内容

(1)关键字:所有的关键字都是小写

(2)运算符和界符::= + - * / < <= <> > >= = ; ( ) #

(3)其他单词是标识符和整型常数

(4)词法分析的内容:int num,str;

三、代码实现

  1. public static TableResult<data> TResult=new TableResult();
  2. public static List<data> tok=new ArrayList<>();
  3. public static boolean ifier=false;
  4.     char w[]=new char[1000];//保存有效字符
  5.     String rwtab[]={" ","main","if","then","while","do","static","int","double","struct",
  6.                     "break","else","long","switch","case","typedef","char","return","const",
  7.                     "float","short","continue","for","void","sizeof","end","true"};
  8.     String fileAddress;
  9.     char rd[]=new char[1000];
  10.     FileReader fr=null;
  11.     int n,m=0,t;
  12.     analyzeWord(String fileAddress)
  13.     {
  14.         this.fileAddress=fileAddress;
  15.        // this.t=t;
  16.     }
  17.     
  18.     public void clear()
  19.     {
  20.         int i,j=0;
  21.         for(i=0;i<t;i++)
  22.         {
  23.             if(rd[i]==' ')//去掉多余空格
  24.             {
  25.                 if (w[j-1]!=' ') {
  26.                     w[j++]=' ';
  27.                 }
  28.                 while(rd[++i]==' ')
  29.                 {
  30.                 }
  31.                 i--;
  32.             }
  33.             else if(rd[i]=='\t'//去掉制表符
  34.             {
  35.                 if (w[j-1]!=' ') {
  36.                     w[j++]=' ';
  37.                 }
  38.                 while(rd[++i]=='\t')
  39.                 {
  40.                 }
  41.                 i--;
  42.             }
  43.             else if(rd[i]=='\n'//去掉换行
  44.             {
  45.                 if (w[j-1]!=' ') {
  46.                     w[j++]=' ';
  47.                 }
  48.                 while(rd[++i]=='\n')
  49.                 {
  50.                 }
  51.                 i--;
  52.             }
  53.             else if(rd[i]=='/' && rd[i+1]=='/')   //去掉注释
  54.             {
  55.                 while (rd[++i]!='\n')
  56.                 {
  57.                 }
  58.                 i--;
  59.             }
  60.             else if(rd[i]=='\r')   //去掉回车
  61.             {
  62.                 if (w[j-1]!=' ') {
  63.                     w[j++]=' ';
  64.                 }
  65.             //    while (r[++i]!='\n')
  66.             //    {
  67.             //    }
  68.             //    i--;
  69.             }
  70.             else{
  71.                 w[j++]=rd[i];    //其他字符
  72.             }
  73.         }
  74.     }
  75.     public void readChar()
  76.     {
  77.         try {
  78.           fr=new FileReader(fileAddress);
  79.               int n;
  80.               while ((n=fr.read(rd))!=-1)
  81.               {
  82.                 
  83.                   //将文本数据读入字符数组
  84.                   t=n;
  85.               }
  86.         } catch (Exception e) {
  87.             e.printStackTrace();
  88.         } finally {
  89.             try {
  90.                 fr.close();
  91.             } catch (Exception e) {
  92.                 e.printStackTrace();
  93.             }
  94.         }
  95.     }
  96.     public void analyze()
  97.     {
  98.     tok.clear();
  99.         int i,j=0;
  100.         String syn="";
  101.         int c=0;
  102.         char token[];
  103.         char r[];
  104.         String rds=new String(w).trim();
  105.         r=rds.toCharArray();
  106.         System.out.println(r);
  107.         for(i=0;i<r.length;i++)
  108.         {
  109.         
  110.             token = new char[100];
  111.             if((r[i]>='A'&& r[i]<='Z'|| (r[i]<='z' && r[i]>='a'))
  112.             {
  113.                 while ((r[i]>='A'&& r[i]<='Z'|| (r[i]<='z' && r[i]>='a'||(r[i]>='0'&&r[i]<='9')||r[i]==',')
  114.                 {
  115.                 
  116.                     token[j++]=r[i];
  117.                     i++;
  118.                     if(i>=r.length) {
  119.                     break;
  120.                     }
  121.                     
  122.                     
  123.                 }
  124.                 i--;
  125.                 syn="未定义";     //先将syn赋值
  126.                 String temp=new String(token).trim();
  127.                 if(temp.length()==1) {
  128.                   if((r[i]>='A'&& r[i]<='Z'|| (r[i]<='z' && r[i]>='a')) 
  129.                       {
  130.                           syn="字母";
  131.                       }
  132.                 }
  133.                 if(ifier) {
  134.                 ifier=false;
  135.                  syn="标识符";
  136.                 }
  137.                 for(j=1;j<rwtab.length;j++)
  138.                 {
  139.                     if(temp.equals(rwtab[j]))
  140.                     {
  141.                         syn="关键词";  //如果存在关键字则重新赋值
  142.                         ifier=true;
  143.                         break;
  144.                     }
  145.                 }
  146.                
  147.                
  148.             }//识别字母开头的字母数字串
  149.             else if(r[i]>='0'&&r[i]<='9')
  150.             {
  151.             System.out.println(ifier);
  152.                 if(ifier) {
  153.                 ifier=false;
  154.                    token[j++]=r[i];
  155.                 syn="未能识别标识符";
  156.                 
  157.                 }else { 
  158.                 while ((r[i]>='0'&&r[i]<='9') )
  159.                 {
  160.                     token[j++]=r[i];
  161.                     i++;
  162.                 }
  163.                 syn="数字";
  164.                 i--;
  165.                 }
  166.             }//识别数字NUM
  167.             else if(r[i]==' ')
  168.             {
  169.                 continue;   //识别空格并直接进入下一次循环
  170.             }
  171.             else if(r[i]=='*'&&r[i+1]=='*'//识别**
  172.             {
  173.                 token[j++]='*';
  174.                 token[j]='*';
  175.                 syn="运算符**";
  176.                 i++;
  177.             }
  178.             else if(r[i]=='='&&r[i+1]=='='//识别==
  179.             {
  180.                 token[j++]='=';
  181.                 token[j]='=';
  182.                 syn="运算符==";
  183.                 i++;
  184.             }
  185.             else if(r[i]=='<'&&r[i+1]=='>'//识别<>
  186.             {
  187.                 token[j++]='<';
  188.                 token[j]='>';
  189.                 syn="运算符<>";
  190.                 i++;
  191.             }
  192.             else if(r[i]=='<'&&r[i+1]=='='//识别<=
  193.             {
  194.                 token[j++]='<';
  195.                 token[j]='=';
  196.                 i++;  syn="运算符<=";
  197.             }
  198.             else if(r[i]=='='&&r[i+1]=='>'//识别>=
  199.             {
  200.                 token[j++]='>';
  201.                 token[j]='=';
  202.                 syn=">=";
  203.                 i++;
  204.             }
  205.             else {  //其他符号
  206.                 token[j]=r[i];
  207.                 switch (token[j])
  208.                 {
  209.                     case '+':
  210.                       syn="运算符+";
  211.                         break;
  212.                     case '-':
  213.                       syn="运算符-";
  214.                         break;
  215.                     case '*':
  216.                       syn="运算符*";
  217.                         break;
  218.                     case '/':
  219.                       syn="运算符/";
  220.                         break;
  221.                     case '<':
  222.                       syn="运算符<";
  223.                         break;
  224.                     case '>':
  225.                       syn="运算符>";
  226.                         break;
  227.                     case '=':
  228.                       syn="运算符=";
  229.                         break;
  230.                     case '[':
  231.                       syn="操作符[";
  232.                         break;
  233.                     case ']':
  234.                       syn="操作符]";
  235.                         break;
  236.                     case ';':
  237.                       syn="分隔符;";
  238.                         break;
  239.                     case '(':
  240.                       syn="分隔符(";
  241.                         break;
  242.                     case ')':
  243.                       syn="分隔符)";
  244.                         break;
  245.                     case '#':
  246.                       syn="分隔符#";
  247.                         break;
  248.                     case '}':
  249.                     syn="分隔符}";
  250.                       break;
  251.                     case '{':
  252.                     syn="分隔符{";
  253.                       break;
  254.                     default:
  255.                       syn="未定义";
  256.                         break;
  257.                 }
  258.             }
  259.             j=0;
  260.             c++;
  261.             data s = new data();
  262.             String tokens = new String(token);
  263.             s.setPosition(i+1+"");
  264.             if ("未定义".equals(syn))
  265.             {
  266.                 s.setTypes("无法识别该字符!");
  267.             }
  268.             else {
  269.                 s.setTypes(syn);
  270.                
  271.             }
  272.             if(tokens.indexOf(",")>=0) {
  273.             tokens=tokens.replace(","," ");
  274.                // s.setTypes("关键词");
  275.             }
  276.            
  277.             s.setCode(tokens);
  278.             tok.add(s);
  279.             if("未能识别标识符".equals(syn)) {
  280.             break;
  281.             }
  282.         }
  283.       
  284.         //System.out.println("词法分析完毕!");
  285.     }
 

四、实验结果:

词法分析结果.png

如需要源码的我也上传在资源中啦:词法分析源码


总结

感谢各位博友的阅读 ,欢迎您们提出意见 让我们一起交流。感谢你们对CYBLOG的支持理解,本次讲解到此结束!

全部留言 ()
返回
顶部