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

📄 lexer.java

📁 编译器中的词法分析
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
                            		tk = new Token(REMARK,charBuffer,tokenColumn,tokenLine);
                            		break;
                            	}
                            	else{
	                                if (LA(0) == '*' && LA(1) == '/')
	                                {
	                                	charBuffer += nextChar();
	                                	tk = new Token(REMARK,charBuffer,tokenColumn,tokenLine);
	                                    break;
	                                }
	                                else{
	                                	charBuffer += nextChar();
	                                }
                            	}
                            }//for
                        }//if
                        else
                        {
                        	tk = new Token(REMARK,charBuffer,tokenColumn,tokenLine);
                        }
                    }//if
                    //如果是单行注释符
                    else if(LA(1) == '/')
                    {
                    	charBuffer += nextChar();
                    	boolean notNewLineKey = true;
                    	
                    	//向后读取一直到遇到换行符号
                    	while(notNewLineKey)
                    	{
                    		if(LA(1) == '\r')
                    		{
                    			tk = new Token(REMARK,charBuffer,tokenColumn,tokenLine);
                    			notNewLineKey = false;
                    		}
                    		else
                    		{
                    			charBuffer += nextChar();
                    		}
                    	}//while
                    	
                    }
                    //不是注释标识符
                    else
                    {
                    	tk = new Token(DIV,Character.toString(curCh),tokenColumn,tokenLine);
                    }
                }
                else
                {
                	tk = new Token(DIV,Character.toString(curCh),tokenColumn,tokenLine);
                }
                break;

            case '=':
            	if(LA(1) == '=')
            	{
            		charBuffer += nextChar();
            		tk = new Token(EQUA,Character.toString(curCh),tokenColumn,tokenLine);
            	}
            	else
            	{
            		tk = new Token(EVAL,Character.toString(curCh),tokenColumn,tokenLine);
            	}
            	break;
            case '>':
            	if(LA(1) == '=')
            	{
            		charBuffer += nextChar();
            		tk = new Token(EGRTR,Character.toString(curCh),tokenColumn,tokenLine);
            	}
            	else
            	{
            		tk = new Token(GRTR,Character.toString(curCh),tokenColumn,tokenLine);
            	}
            	break;
            case '<':
            	if(LA(1) == '=')
            	{
            		charBuffer += nextChar();
            		tk = new Token(ELESS,Character.toString(curCh),tokenColumn,tokenLine);
            	}
            	else
            	{
            		tk = new Token(LESS,Character.toString(curCh),tokenColumn,tokenLine);
            	}
                break;
            case '!':
            	if(LA(1) == '=')
            	{
            		charBuffer += nextChar();
            		tk = new Token(NEQUA,Character.toString(curCh),tokenColumn,tokenLine);
            	}
            	else
            	{
            		tk = new Token(NOT,Character.toString(curCh),tokenColumn,tokenLine);
            	}
            	break;
        }
        return tk;
    }

    /**
     * 判断是否是加减号还是正负数
     * @param startPlace
     * @param curCh
     */
    public Token isAddOrMinus(int startPlace, char curCh) {
    	
    	Token tk = null;
    	String charBuffer = Character.toString(curCh);
    	
    	switch (curCh) {
	    	case '+':
	    		//如果加号不是第一位
	    		if (startPlace != 0 )
		    	{
		    		boolean key = true;
		    		
		    		//向前遍历判断是加号还是正号
		    		while(key) {
		    			int i = -1;
		    			
		    			//如果是正号
		    			if (LA(i) == '(' || LA(i) == '&' || LA(i) == '|' 
		    				|| LA(i) == '=' || LA(i) == '>' || LA(i) == '<')
		    			{
		    				//正号的后一位是数字
		    				if (Character.isDigit(LA(1))) 
		    				{
		    					char firstNum = nextChar();
		    					Token numberBuffer = isNumber(CharQueue.head - 1, firstNum);
		    					charBuffer += numberBuffer.getTxt();
		    					
		    					//后面的数字串是整数
		    					if(numberBuffer.getType() == 31)
		    					{
		    						tk = new Token(VINT, charBuffer,tokenColumn, tokenLine);
		    						key = false;
		    					}
		    					//后面的数字串是实数
		    					else if(numberBuffer.getType() == 32) 
		    					{
		    						tk = new Token(VREAL, charBuffer,tokenColumn, tokenLine);
		    						key = false;
		    					}
		    					//后面的数字串是非法数字串
		    					else 
		    					{
		    						tk = new Token(INVALIDNUM, charBuffer,tokenColumn, tokenLine);
		    						key = false;
		    					}		    					
		    				}
		    				//后面一位是终结符
		    				else if(isEndChar(LA(1)))
		    				{
		    					tk = new Token (ADD, charBuffer, tokenColumn, tokenLine);
			    				key = false;
		    				}
		    				//后面一位是其他符号
		    				else
		    				{
		    					charBuffer += nextChar();		    					
		    					boolean keyNotEnd = true;
		    					
		    					//持续向后读取直到终结符号
		    					while(keyNotEnd) {		    						
		    						if (isEndChar(LA(1)))
		    						{
		    							tk = new Token (INVALIDNUM, charBuffer, tokenColumn, tokenLine);
		    							keyNotEnd = false;
		    							key = false;
		    						}
		    						else 
		    						{
		    							charBuffer += nextChar();
		    						}
		    					}
		    				}
		    			}
		    			//前一位是空格或制表符号,继续向前遍历
		    			else if(LA(i) == ' ' || LA(i) == '\t')
		    			{
		    				i--;
		    			}
		    			//前一位不是空格制表符号,也不是( & | = > <
		    			else
		    			{
		    				tk = new Token (ADD, charBuffer, tokenColumn, tokenLine);
		    				key = false;
		    			}
		    		}
		    	}
	    		//如果加号是第一位
		    	else 
		    	{
		    		tk = new Token (ADD, charBuffer, tokenColumn, tokenLine);
		    	}
	    		break;
	    		
	    	case '-': 
//	    		如果减号不是第一位
	    		if (startPlace != 0 )
		    	{
		    		boolean key = true;
		    		
		    		//向前遍历判断是减号还是负号
		    		while(key) {
		    			int i = -1;
		    			
		    			//如果是负号
		    			if (LA(i) == '(' || LA(i) == '&' || LA(i) == '|' 
		    				|| LA(i) == '=' || LA(i) == '>' || LA(i) == '<')
		    			{
		    				//负号的后一位是数字
		    				if (Character.isDigit(LA(1))) 
		    				{
		    					char firstNum = nextChar();
		    					Token numberBuffer = isNumber(CharQueue.head - 1, firstNum);
		    					charBuffer += numberBuffer.getTxt();
		    					
		    					//后面的数字串是整数
		    					if(numberBuffer.getType() == 31)
		    					{
		    						tk = new Token(VINT, charBuffer,tokenColumn, tokenLine);
		    						key = false;
		    					}
		    					//后面的数字串是实数
		    					else if(numberBuffer.getType() == 32) 
		    					{
		    						tk = new Token(VREAL, charBuffer,tokenColumn, tokenLine);
		    						key = false;
		    					}
		    					//后面的数字串是非法数字串
		    					else 
		    					{
		    						tk = new Token(INVALIDNUM, charBuffer,tokenColumn, tokenLine);
		    						key = false;
		    					}		    					
		    				}
		    				//后面一位是终结符
		    				else if(isEndChar(LA(1)))
		    				{
		    					tk = new Token (MIN, charBuffer, tokenColumn, tokenLine);
			    				key = false;
		    				}
		    				//后面一位是其他符号
		    				else
		    				{
		    					charBuffer += nextChar();		    					
		    					boolean keyNotEnd = true;
		    					
		    					//持续向后读取直到终结符号
		    					while(keyNotEnd) {		    						
		    						if (isEndChar(LA(1)))
		    						{
		    							tk = new Token (INVALIDNUM, charBuffer, tokenColumn, tokenLine);
		    							keyNotEnd = false;
		    							key = false;
		    						}
		    						else 
		    						{
		    							charBuffer += nextChar();
		    						}
		    					}
		    				}
		    			}
		    			//前一位是空格或制表符号,继续向前遍历
		    			else if(LA(i) == ' ' || LA(i) == '\t')
		    			{
		    				i--;
		    			}
		    			//前一位不是空格制表符号,也不是( & | = > <
		    			else
		    			{
		    				tk = new Token (MIN, charBuffer, tokenColumn, tokenLine);
		    				key = false;
		    			}
		    		}
		    	}
	    		//如果减号是第一位
		    	else 
		    	{
		    		tk = new Token (MIN, charBuffer, tokenColumn, tokenLine);
		    	}
		    	break;
    	}
    	return tk;
    }
    
    /**
     * 判断是否为数字
     * @param startPlace
     * @param curCh
     * @return
     */
	public Token isNumber(int startPlace, char curCh) {
		
		Token tk = null;
		String charBuffer = Character.toString(curCh);
		
		switch(curCh){
			case '0':
				//后一位字符为终结符
				if (isEndChar(LA(1))) 
				{					
					tk = new Token (INT, charBuffer, tokenColumn, tokenLine);
				}
				//后一位字符为.
				else if (LA(1) == '.') 
				{
					charBuffer += nextChar();
					
					//如果下一个字符为终结符
					if (isEndChar(LA(1))) 
					{
						tk = new Token (INVALIDNUM, charBuffer, tokenColumn, tokenLine);
					}
					else if (Character.isDigit(LA(1)))
					{
						charBuffer += nextChar();
						boolean key = true;
						boolean keepNum = true;
						
						while(key) 
						{
							if (isEndChar(LA(1))) 
							{	
								if (keepNum)
								{
									tk = new Token (REAL, charBuffer, tokenColumn, tokenLine);
									key = false;
								}
								else 
								{
									tk = new Token (INVALIDNUM, charBuffer, tokenColumn, tokenLine);
									key = false; 
								}
							}
							else if (Character.isDigit(LA(1)))
							{
								charBuffer += nextChar();
							}
							else 
							{
								keepNum = false;
								charBuffer += nextChar();
							}
						}
					}
					else
					{				
						charBuffer += nextChar();
						boolean key = true;	
						
						//持续读取其他符号,直至遇到终结符停止,输出字符串
						while(key){
							if (isEndChar(LA(1))) 
							{							
								tk = new Token (INVALIDNUM, charBuffer, tokenColumn, tokenLine);
								key = false;
							}
							else  
							{
								charBuffer += nextChar();
							}
						}						
					}
				}
				//后一位字符为其他字符(除.和终结符以外的)
				else  {			
					charBuffer += nextChar();
					boolean key = true;
					
					//持续读取其他符号,直至遇到终结符停止,输出字符串
					while(key){
						if (isEndChar(LA(1))) 
						{							
							tk = new Token (INVALIDNUM, charBuffer, tokenColumn, tokenLine);
							key = false;
						}
						else  
						{
							charBuffer += nextChar();
						}
					}
				}
				break;
								
			case '1':
			case '2':
			case '3':
			case '4':
			case '5':
			case '6':
			case '7':
			case '8':
			case '9':	
				
				//如果后一位是终结符
				if (isEndChar(LA(1)))
				{

⌨️ 快捷键说明

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