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

📄 ws_scan.java

📁 用java实现c的词法分析
💻 JAVA
字号:
package com.gyg.WordScanner;

import java.io.*;
import java.util.*;

public class WS_Scan implements WS_TypeCode 
{
	private char[] chs;
	private int p;
	public int curClass;
	public String curValue;
	public Set<WS_Const> constTable;//常量表
	public Set<WS_Mark> markTable;  //标识符表  
	public BufferedReader in;
	public PrintWriter out;
	WS_Scan(String inPath,String outPath) throws Exception
	{
		StringBuilder s=new StringBuilder();
		in = new BufferedReader(new FileReader(inPath));
		int c;
		while((c=in.read())!= -1)
		{
			s.append((char)c);
		}
		String s1=s.toString();
		chs=s1.toCharArray();
		in.close();
        out=new PrintWriter(new FileOutputStream(outPath));
		p=0;
		curClass=$INIT;
		curValue=null;
		constTable=new HashSet<WS_Const>();
		markTable=new HashSet<WS_Mark>();
	}
	private void scan() throws Exception
	{
		int len=chs.length;
		while(p<len)
		{
			curClass=$INIT;
			curValue=null;
			while(chs[p]==' '||chs[p]=='\t'||chs[p]=='\n'){
				p++;
				if(p==len)
					return;
			}
			if(Character.isLetter(chs[p])||chs[p]=='_')
			{
				int st=p;
				p++;
				while(p<len&&Character.isLetterOrDigit(chs[p]))
				{
					p++;
				}
				curValue=new String(chs,st,p-st);
			    if(isReservedWord(curValue))
				    curClass=getType(curValue);
			    else 
			    {   
			    	curClass=$MARK;
					WS_Mark c=new WS_Mark(curClass,curValue);
			    	if(!isVariable(c))			    	
			    	{
			    	    markTable.add(c);
			    	}
			    }
		            out.println("("+curClass+","+curValue+")");
			}
			else if(Character.isDigit(chs[p]))
			{
				WS_Const c;
				boolean isFloat=false;
				int st=p;
				p++;
				while(p<len&&Character.isDigit(chs[p])||chs[p]=='.'||chs[p]=='e')
				{
					if(chs[p]=='.'||chs[p]=='e')
					{
					    isFloat=true;
					    curClass=$FLOAT;
					}
					else
					{
					    curClass=$INT;
					}
					p++;
				}
				if(chs[p-1]=='e')
				{
				    throw new Exception("浮点型最后不能为'e'");
				}
				curValue=new String(chs,st,p-st);
				if(isFloat)
				{
					c=new WS_Const(curClass,Float.parseFloat(curValue));
				}
				else
				{
					c=new WS_Const(curClass,Integer.parseInt(curValue));
				}
			    constTable.add(c);
			    out.println("("+curClass+","+curValue+")");
			}
			else if(isStringStart(chs[p]))
			{
				char endc=getStringEnd(chs[p]);
				p++;
				int st=p; 
				while(p<len && chs[p]!=endc){
					p++;
					if(p==len)
						throw new Exception("缺小"+endc+"!");
				}
				curValue=new String(chs,st,p-st);
				curClass=$STRING;
				WS_Const c=new WS_Const($STRING,curValue);
		    	constTable.add(c);
		        out.println("("+curClass+","+curValue+")");
				p++;
				
			}
			else 
			{
				int st=p;
				switch(chs[p])
				{
		
					case ',':
						p++;
						curClass=$COMMAND;
						break;
					case ';':
						p++;
						curClass=$SEMICOLON ;
						break;
					case ':':
						p++;
						curClass=$COLON;
						break;
					case '[':
						p++;
						curClass=$LBLACK ;
						break;
					case ']':
						p++;
						curClass=$RBLACK ;
						break;
					case '(':
						p++;
						curClass=$LPARENTHESES;
						break;
					case ')':
						p++;
						curClass=$RPARENTHESES;
						break;
					case '+':
						p++;
						curClass=$PLUS;
						break;
					case '-':
						p++;
						curClass=$MINUS;
						break;
					case '*':
						p++;
						curClass=$MULTIPLY;
						break;
					case '/':
						p++;
						curClass=$DIVIDE;
						break;
					case '%':
						p++;
						curClass=$MOD;
						break;
					case '=':
						p++;
						if(p<len&&chs[p]=='='){
							curClass=$EQUAL;
							p++;
						}
						else{
							curClass=$BECOME;
						}
						break;
					case '>':
						p++;
						if(p<len&&chs[p]=='='){
							curClass=$GEQ;
							p++;
						}
						else{
							curClass=$GTR;
						}
						break;
					case '<':
						p++;
						if(p<len&&chs[p]=='='){
							curClass=$LEQ;
							p++;
						}
						else{
							curClass=$LSS;
						}
						break;
					case '!':
						p++;
						if(p<len&&chs[p]=='='){
							curClass=$NEQUAL;
							p++;
						}
						else{
							curClass=$NOT;
						}
						break;
					case '&':
						p++;
						if(p<len&&chs[p]=='&'){
							curClass=$lAND;
							p++;
						}
						else{
							curClass=$AND;
						}
						break;
					case '|':
						p++;
						if(p<len&&chs[p]=='|'){
							curClass=$LOR;
							p++;
						}
						else{
							curClass=$OR;
						}
						break;
					
					default:
						throw new Exception("存在非法字符->"+chs[p]);
				}
				if(p-st==1)
					curValue=new String(chs,st,1);
				else
					curValue=new String(chs,st,2);
			        out.println("("+curClass+","+curValue+")");
			}
		}
		out.close();
		return;
	}
	private boolean isVariable(WS_Mark c)
	{
		return (markTable.contains(c));
	}
	private boolean isReservedWord(String s)
	{
		return WS_ReservedWord.res.containsKey(s);
	}
	private int getType(String s)
	{
		return WS_ReservedWord.res.get(s);
	}
    private boolean isStringStart(char c)
	{
		if(c=='\"' || c=='\'' || c=='[')  //'\'' javascript有这种类型
			return true;
		else
			return false;
	}
	private char getStringEnd(char c)
	{
		if(c=='\"')
			return '\"';
		else if(c=='\'')
			return '\'';
		else
			return ']';
	}

	public static void main(String[] args)throws Exception
	{
		WS_Scan ws=new WS_Scan("C:/eclipse/workspace/WordScanner/1.txt","C:/eclipse/workspace/WordScanner/2.txt");
		ws.scan();
        System.out.println("********************************************************");
        System.out.println("标识符列表:");
		for(WS_Mark c:ws.markTable)
		{
			System.out.println(c);
		}
        System.out.println("********************************************************");
        System.out.println("常量列表:");
        for(WS_Const c:ws.constTable)
        {
        	System.out.println(c);
        }
	}
}

⌨️ 快捷键说明

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