⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lexicalanalysis.java

📁 编译原理的课程设计
💻 JAVA
字号:
package source;

import java.util.LinkedList;

public class LexicalAnalysis 
{
	//私有变量声明
    private LinkedList<Word> optr = new LinkedList<Word>();
    private String exp;
    //词法分析
    public LinkedList<Word> lexical_analysis(String exp) 
    {
		char ch = '\0';          //当前文件指针内容
		int index = 0;           //文件指针
        StringBuffer strToken = new StringBuffer("");
		//扫描处理字符串
		while(true) 
		{
	    	ch = exp.charAt(index);
	    	index++;
	    	//标识符(字母开头,数字或字符组成)
	    	if(Character.isLetter(ch))
	    	{
                while(Character.isLetter(ch) || Character.isDigit(ch)) 
                {
                    strToken.append(ch);
                    ch = exp.charAt(index);
                    index++;
            	}
                index--;
                String str = strToken.toString();
                if(str.equals("if"))
                	optr.add(new Word(str, 13));
                else if(str.equals("else"))
                	optr.add(new Word(str, 14));
                else if(str.equals("then"))
                	optr.add(new Word(str, 15));
                else
                	optr.add(new Word(str, 26));  
            }
            //数字
            else if(Character.isDigit(ch)) 
            {
                while(Character.isDigit(ch)) 
                {
                    strToken.append(ch);
		    		ch = exp.charAt(index);
		    		index++;
	        	}
                index--;
                optr.add(new Word(strToken.toString(), 26));
            }
            //加号或自加
            else if(ch == '+')
            {
            	ch = exp.charAt(index);
                index++;
                if(ch == '+')
                	optr.add(new Word("++", 21));
	        	else if(ch == '=')
	        		optr.add(new Word("+=", 16));
	        	else 
	        	{
		    		index--;
		    		optr.add(new Word("+", 19));
                }
            }
            //加号或自加
            else if(ch == '-')
            {
            	ch = exp.charAt(index);
                index++;
                if(ch == '-')
                	optr.add(new Word("--", 21));
	        	else if(ch == '=')
	        		optr.add(new Word("-=", 16));
	        	else 
	        	{
		    		index--;
		    		optr.add(new Word("-", 19));
                }
            }
            //乘法或乘幂
	    	else if(ch == '*') 
	    	{
	        	ch = exp.charAt(index);
                index++;
                if(ch == '*')
                	optr.add(new Word("**", 20));
	        	else if(ch == '=')
	        		optr.add(new Word("*=", 16));
	        	else 
	        	{
		    		index--;
		    		optr.add(new Word("*", 20));
                }
            }
            //除法或注释
            else if(ch == '/')
            {
	        	ch = exp.charAt(index);
                index++;
                //多行注释
                if(ch == '*')
                {
                	while(true)
                	{
                		ch = exp.charAt(index);
                		index++;
                		if(ch == '*')
                		{
                			ch = exp.charAt(index);
                			index++;
                			if(ch == '/') break;
                			else if(ch == '\n')
                			{
                				exp = Input.newLine();
                				index = 0;
                				ch = exp.charAt(index);
                				index++;
                			}
                			else index--;
                		}
                		else if(ch == '#')
        				{
        					int tIndex = index - 1;
			        		if(exp.length() > tIndex+9)
			        		{
			        			String end = exp.substring(tIndex, tIndex+9);
			        			if(end.equals("#?e_N_d?#")) break;
			        		}
			        		else
			        		{
			        			System.out.println("非法符号\'#\'后的语句忽略!");
			        			exp = Input.newLine();
			        			index = 0;
			        			break;
			        		}
        				}
        				else if(ch == '\n')
                		{
                			exp = Input.newLine();
                			index = 0;
                		}
                	}
                }
                //单行注释
                else if(ch == '/')
                	break; 
                else if(ch == '=')
             		optr.add(new Word("/=", 16));
	        	else 
	        	{
		    		index--;
		    		optr.add(new Word("/", 20));
                }
            }
            //大于或大于等于或右移
            else if(ch == '>')
            {
            	ch = exp.charAt(index);
            	index++;
            	if(ch == '=')
            		optr.add(new Word(">=", 18));
            	else if(ch == '>')
            		optr.add(new Word(">>", 20));
            	else
            	{
            		index--;
            		optr.add(new Word(">", 18));
            	}
            }
            //小于或小于等于或左移
            else if(ch == '<')
            {
            	ch = exp.charAt(index);
            	index++;
            	if(ch == '=')
            		optr.add(new Word("<=", 18));
            	else if(ch == '<')
            		optr.add(new Word("<<", 20));
            	else
            	{
            		index--;
            		optr.add(new Word("<", 18));
            	}
            }
            //赋值或等于
            else if(ch == '=')
            {
            	ch = exp.charAt(index);
            	index++;
            	if(ch == '=')
            		optr.add(new Word("==", 18));
            	else
            	{
            		index--;
            		optr.add(new Word("=", 16));
            	}
            }
            //或运算按位或
            else if(ch == '|')
            {
            	ch = exp.charAt(index);
            	index++;
            	if(ch == '|')
            		optr.add(new Word("||", 17));
            	else
            	{
            		index--;
            		optr.add(new Word("|", 20));
            	}
            }
            //与运算
            else if(ch == '&')
            {
            	ch = exp.charAt(index);
            	index++;
            	if(ch == '&')
            		optr.add(new Word("&&", 17));
            	else
            	{
            		index--;
            		optr.add(new Word("&", 20));
            	}
            }
            //非运算或不等于
            else if(ch == '!')
            {
            	ch = exp.charAt(index);
            	index++;
            	if(ch == '=')
            		optr.add(new Word("!=", 18));
            	else
            	{
            		index--;
            		optr.add(new Word("!", 21));
            	}
            }
            //按位亦或
            else if(ch == '^')
            	optr.add(new Word("^", 20));
            //取模运算
            else if(ch == '%')
            	optr.add(new Word("%", 20));
            //左括号
	    	else if(ch == '(')
                optr.add(new Word("(", 22));
            //右括号
	    	else if(ch == ')')
                optr.add(new Word(")", 23));
            //左大括号
            else if(ch == '{')
            	optr.add(new Word("{", 24));
            //右大括号
            else if(ch == '}')
            	optr.add(new Word("}", 25));
	   		//结束扫描标志为:#?e_N_d?#
	   		else if(ch == '\n')
	   		{
	   			break;
	   		}
        	else if(ch == '#')
        	{
        		int tIndex = index - 1;
        		if(exp.length() > tIndex+9)
        		{
        			String end = exp.substring(tIndex, tIndex+9);
        			if(end.equals("#?e_N_d?#"))
        			{
        				optr.add(new Word("#", 27));
        				break;
        			}
        		}
        		else
        		{
        			System.out.println("非法符号\'#\'后的语句忽略!");
        			optr.add(new Word("#", 27));
        			break;
        		}
        	}
        	//清空扫描串
            strToken.setLength(0);
		}
		return optr;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -