编译原理词法分析(java版本)
读取文件,,
示例:
int aaa000sss =10;
if(a>=b)
{system 10;}
while(int a=10;i++)
{a*=10;a--;a+=10;<+;
return 0;}
if(a>=b)
{system 10;}
while(int a=10;i++)
{a*=10;a--;a+=10;<+;
return 0;}
最终结果为:
87
<int,关键字>
<aaa000sss,标识符>
<=,运算符>
<10,常数>
<;,分界符>
<if,关键字>
<(,分界符>
<a,标识符>
<>=,运算符>
<b,标识符>
<),分界符>
<{,分界符>
<system,关键字>
<10,常数>
<;,分界符>
<},分界符>
<while,关键字>
<(,分界符>
<int,关键字>
<a,标识符>
<=,运算符>
<10,常数>
<;,分界符>
<i,标识符>
<++,运算符>
<),分界符>
<{,分界符>
<a,标识符>
<*=,运算符>
<10,常数>
<;,分界符>
<a,标识符>
<--,运算符>
<;,分界符>
<a,标识符>
<+=,运算符>
<10,常数>
<;,分界符>
<<,运算符>
<+,运算符>
<;,分界符>
<return,关键字>
<0,常数>
<;,分界符>
<},分界符>
<int,关键字>
<aaa000sss,标识符>
<=,运算符>
<10,常数>
<;,分界符>
<if,关键字>
<(,分界符>
<a,标识符>
<>=,运算符>
<b,标识符>
<),分界符>
<{,分界符>
<system,关键字>
<10,常数>
<;,分界符>
<},分界符>
<while,关键字>
<(,分界符>
<int,关键字>
<a,标识符>
<=,运算符>
<10,常数>
<;,分界符>
<i,标识符>
<++,运算符>
<),分界符>
<{,分界符>
<a,标识符>
<*=,运算符>
<10,常数>
<;,分界符>
<a,标识符>
<--,运算符>
<;,分界符>
<a,标识符>
<+=,运算符>
<10,常数>
<;,分界符>
<<,运算符>
<+,运算符>
<;,分界符>
<return,关键字>
<0,常数>
<;,分界符>
<},分界符>
package downloadtest;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
public class cifafenxi {
private int count=0;
private char[] a;
char[] alls;
public cifafenxi(){
try {
readFile();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//读取文件
public int readFile() throws Exception{
FileInputStream fileInputStream=new FileInputStream("D:\\text.txt");
InputStreamReader reader=new InputStreamReader(fileInputStream);
BufferedReader bufferedReader=new BufferedReader(reader);
char[] cbuf=new char[1024];
String text=null;
String all="";
while((text=bufferedReader.readLine())!=null){
all=all+text;
}
alls=all.toCharArray();
count=alls.length;
System.out.println(count);
a=new char[count];
return count;
}
//识别字母
public boolean isLetter(char letter){
if((letter>='a'&&letter<='z')||(letter>='A'&&letter<='Z')){
return true;
}else{
return false;
}
}
//识别数字
public boolean isNumber(char number){
if(number>='0'&&number<='9'){
return true;
}else{
return false;
}
}
//识别分界符
public boolean isBoundary(char boundary){
char[] boundaryAll={',',';',':','"','(',')','{','}'};
for(int i=0;i','<'};
for(int i=0;i=","<="};
for(int i=0;i");
else
System.out.println("<"+word+",标识符>");
i--;
continue;
}
}
if(isFunction(alls[i])){//识别一元运算符和二元运算符
String word=""+alls[i]+alls[i+1];
if(isAllFunction(word)){
System.out.println("<"+word+",运算符>");
i++;
}else{
System.out.println("<"+alls[i]+",运算符>");
}
continue;
}
if(isBoundary(alls[i])){//识别分界符
System.out.println("<"+alls[i]+",分界符>");
continue;
}
if(isNumber(alls[i])){
String word="";
while(isNumber(alls[i])){//数字+数字
word+=alls[i];
i++;
if(!isNumber(alls[i])){
System.out.println("<"+word+",常数>");
System.out.println("<"+alls[i]+",分界符>");
}
}
/*while(isLetter(alls[i])){//数字+字母
word+=alls[i];
i++;
if(isBoundary(alls[i])||isFunction(alls[i])){
System.out.println("<"+word+",标识符>");
}
}*/
continue;
}
}
}
public static void main(String[] args) {
cifafenxi cifafenxi=new cifafenxi();
cifafenxi.Run();
}
}
下次写一个编译原理(C)版本的语法分析!时间好紧,,还有好多事,复习功课啊,刚巴黎