-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLexicalAnalysis.java
176 lines (150 loc) · 8.53 KB
/
LexicalAnalysis.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
/**
*
* @author Kadir ARSLAN
* @author Semih DEMIRCI
* Lexical Analysis For Java
*/
package LexicalAnalysis;
//Gerekli kutuphaneler eklendi.
import java.io.*;
import java.util.ArrayList;
public class LexicalAnalysis {
public static void main(String[] args) {
//Fonksiyon degiskenlerini tutmak icin gerekli class tanimlandi.
class functions{
String functionName;
String returnValue;
int countOfParameter;
String parameterValue;
}
//Programda kullanilacak degiskenler tanimlandi.
int countOfVar = 0;
int countOfFunction = 0;
int countOfComma;
int commentIndex = 0;
int semicolonIndex;
String[] arraySplitted;
ArrayList arrayList = new ArrayList();
functions functionObj = new functions();
String str;
//Dosya ismini tutan degisken tanimlandi.
String fName = "Program.java";
//Verilen klasor yolundaki dosya okunmaya baslandi.
try{
BufferedReader file = new BufferedReader(new FileReader(fName));
//Dosya sonuna gelene kadar okuma devam ediyor.
while((str = file.readLine()) != null) {
//Class isminin bulunmasi amaciyla kontrol yapiliyor.
if(str.contains("class")){
//Class ismi belirtilen formatta aliniyor.
int nameIndex = str.indexOf(" ");
String name = str.substring(nameIndex+1);
nameIndex = name.indexOf(" ");
String className = name.substring(nameIndex+1);
if(className.contains(" "))
className = className.substring(0,className.length()-2);
else if(className.contains("{"))
className = className.substring(0,className.length()-1);
System.out.println("Class Name" + className);
}
// /* ... */ seklinde olan yorum araliklari hesaba katilmadan degisken ve fonksiyonlar
// tespit ediliyor.
for(int i=0 ; i<str.length() ; i++){
int slashIndex = str.indexOf("/",i);
int starIndex = str.indexOf("*",i);
if(slashIndex != -1 && starIndex != -1)
commentIndex = str.indexOf("*/",i);
if (commentIndex == -1)
str=" ";
}
//Degisken tur kontrolleri yapiliyor.
if(str.contains("int")||str.contains("boolean")||str.contains("byte")
||str.contains("char")||str.contains("double")||str.contains("float")
||str.contains("long")||str.contains("short")||str.contains("void")||str.contains("String")){
//Degisken sayisi hesaplanarak, degiskenler ArrayList'e ataniyor.
if(!str.contains("(") && !str.contains("//")){
countOfVar++;
arraySplitted = str.split(" ");
semicolonIndex = arraySplitted[arraySplitted.length-1].indexOf(";");
String b = arraySplitted[arraySplitted.length-1].substring(0,semicolonIndex);
String c =arraySplitted[arraySplitted.length-2];
arrayList.add(b+" - "+c);
}
//Fonksiyon Sayisi Hesaplaniyor.
if(str.contains("(") && str.contains(")") && !str.contains("return") && !str.contains("//") ){
countOfFunction++;
}
}
}
// Try blogunda hata ile karsilasilirsa hata mesaji yazdiriliyor.
}catch (IOException e){
System.out.println("HATA ! ");
}
// Bulunan alt eleman sayisi yazdiriliyor.
System.out.println("Sub-elements:"+countOfVar);
// Degiskenlerin icinde bulundugu ArrayList yazdiriliyor.
for(int i = 0;i<arrayList.size();i++)
System.out.println(arrayList.get(i));
//Uye fonksiyon sayisi yazdiriliyor.
System.out.println("Functions Count:"+countOfFunction+"");
//Verilen klasor yolundaki dosya okunmaya baslandi.
try{
BufferedReader file = new BufferedReader(new FileReader(fName));
//Dosya sonuna gelene kadar okuma devam ediyor.
while((str = file.readLine()) != null) {
// /* ... */ seklinde olan yorum araliklari hesaba katilmadan degisken ve fonksiyonlar
// tespit ediliyor.
for( int i=0;i<str.length();i++){
int slashIndex=str.indexOf("/",i);
int starIndex=str.indexOf("*",i);
if(slashIndex!=-1 && starIndex!=-1)
commentIndex=str.indexOf("*/",i);
if(commentIndex==-1)
str=" ";
}
//Fonksiyon degerlerini bulmak icin gerekli kontrol yapiliyor.
if(str.contains("(") && str.contains(")") && !str.contains("return") && !str.contains("//")){
int leftParenthesis = str.indexOf("(");
int rightParenthesis = str.indexOf(")");
String splitValue = str.substring(0,leftParenthesis);
int blank = splitValue.lastIndexOf(" ");
int blank1 = splitValue.indexOf(" ");
String parameterValue = str.substring(leftParenthesis+1,rightParenthesis);
//Parametre olmamasi durumunda "Yok" ifadesi parametre degeri olarak ataniyor.
if(parameterValue.isEmpty()){
parameterValue = "None";
}
functionObj.parameterValue=parameterValue;
//Bulunan fonksiyondaki parametre sayisi hesaplaniyor.
boolean commaControl = parameterValue.contains(",");
if(commaControl == true){
String[] commaCount = parameterValue.split(",");
countOfComma = commaCount.length;
functionObj.countOfParameter= countOfComma;
}
if(commaControl == false){
if("Yok".equals(parameterValue)){
countOfComma = 0;
functionObj.countOfParameter=countOfComma;
}
else functionObj.countOfParameter = 1;
}
//Bulunan degiskenler nesneye ataniyor.
functionObj.functionName = splitValue.substring(blank);
functionObj.returnValue = splitValue.substring(blank1,blank);
if(functionObj.returnValue.isEmpty()) functionObj.returnValue = "Yok";
//Istenilen cikti seklinde ekrana yazdiriliyor.
System.out.println("-------------");
System.out.println("Name:"+functionObj.functionName);
System.out.println("Return Type:"+functionObj.returnValue);
System.out.println("Count of Parameter:"+functionObj.countOfParameter);
System.out.println("Parameter:"+functionObj.parameterValue);
}
}
}
// Try blogunda hata ile karsilasilirsa hata mesaji yazdiriliyor.
catch (IOException e) {
System.out.println("HATA ! ");
}
}
}