컴 파일 원리 작업 5

18610 단어

문법 분석 프로그램 (Lexical Analyzer) 요구:
- 원본 프로그램 을 구성 하 는 문자 흐름 을 왼쪽 에서 오른쪽으로 스 캔
-  어법 적 의미 가 있 는 단어 식별 (Lexemes)
-  단어 기록 되 돌려 주기 (단어 종류, 단어 자체)
-  스페이스 바 를 거르다
-  주석 건 너 뛰 기
-  어법 오류 발견
 
프로그램 구성:
입력: 문자 흐름 (입력 방식, 데이터 구조 저장)
처리:
– 옮 겨 다 니 기 (어떤 옮 겨 다 니 는 방식)
- 어법 규칙
출력: 단어 흐름 (출력 형식)
– 이원 조
 
단어 종류:
1. 식별 자 (10)
2. 부호 없 음 (11)
3. 보존 글자 (한 단어 한 코드)
4. 연산 자
5. 계부 (한 단어 한 부호)
 
단어 기호
종 별 부호
단어 기호
종 별 부호
begin
1
:
17
if
2
:=
18
then
3
<
20
while
4
<=
21
do
5
<>
22
end
6
>
23
l(l|d)*
10
>=
24
dd*
11
=
25
+
13
;
26
-
14
(
27
*
15
)
28
/
16
#
0
 
워드 클래스:
public class word {     //      
private int typenum; //
private String word;//
public int getTypenum() {
return typenum;
}
public void setTypenum(int typenum) {
this.typenum = typenum;
}
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}

}

keywords :

public class keywords {
private static String KEYWORDS = " ";//
private word words;
private char[] input = new char[255];
private char[] token = new char[255];
private int p_input=0;//
private int p_token=0;//
private char ch; //

private String[] rwtab = {"begin", "if", "then","while", "do", "end", KEYWORDS};

public keywords(char [] input){
this.input = input;

}

public char ch_getCh(){ // ,
if (p_input ch=input[p_input];
p_input++;
}
return ch;
}

public void getbch(){ //
while ((ch == ' '||ch =='\t')&&(p_input ch = input[p_input];
p_input++;

}

}

public void concat(){ //
token[p_token] = ch;
p_token++;
token[p_token]='\0';

}

public boolean letter() { //

if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')

return true;

else

return false;

}

public boolean num() { //

if(ch>='0'&&ch<='9')

return true;

else

return false;

}


public void re() {//

p_input--;

}

public String dtb() {
int num = token[0] - 48;
for(int i = 1; i < p_token; i++) {
num = num * 10 + token[i] - 48;
}
StringBuilder result = new StringBuilder(); //
while(num>0) {
int r = num % 2;
int s = num / 2;
result.append(r);
num = s;
}
return result.reverse().toString();
}
public int reserve() { // token
int i=0;
while(rwtab[i].compareTo(KEYWORDS)!=0) {
if(rwtab[i].compareTo(new String(token).trim()) == 0) {//
return i+1;
}
i++;
}
return 10;
}

public word scan() //
{
token = new char[255];
word myWord = new word();
myWord.setTypenum(10);
myWord.setWord("");
p_token=0;
ch_getCh();
getbch();

if(letter()) { //
while(letter()||num()) {
concat();
ch_getCh();
}
re();
myWord.setTypenum(reserve());
myWord.setWord(new String(token).trim());
return myWord;
}
else if(num()) {
while(num()) {
concat();
ch_getCh();
}
re();
myWord.setTypenum(11);
myWord.setWord(new String(token).trim()); // token //
myWord.setWord(dtb()); // token 10
return myWord;
}
else
switch (ch) {
case '=':
myWord.setTypenum(25);
myWord.setWord("=");
return myWord;
case '+':
myWord.setTypenum(13);
myWord.setWord("+");
return myWord;
case '-':
myWord.setTypenum(14);
myWord.setWord("-");
return myWord;
case '*':
myWord.setTypenum(15);
myWord.setWord("*");
return myWord;
case '/':
ch_getCh(); // , 30
if (ch == '/') {
while(ch_getCh() != '
');
myWord.setTypenum(30);
myWord.setWord("\
");
return myWord;
}
// , 31
if(ch=='*') {
String string = "";
while(true) {
if (ch == '*') {
if (ch_getCh() == '/') { //
myWord.setTypenum(31);
myWord.setWord(string);
return myWord;
}
re();
}
if (ch_getCh() == '
') { //
string += "\
";
}
}
}
re();
myWord.setTypenum(16);
myWord.setWord("/");
return myWord;
case ':':
ch_getCh();
if(ch=='=') {
myWord.setTypenum(18);
myWord.setWord(":=");
return myWord;
}
re();
myWord.setTypenum(17);
myWord.setWord(":");
return myWord;
case ' ch_getCh();
if(ch=='=') {
myWord.setTypenum(21);
myWord.setWord("<=");
return myWord;
}
else if (ch == '>') {
myWord.setTypenum(22);
myWord.setWord("<>");
return myWord;
}
re();
myWord.setTypenum(20);
myWord.setWord(" return myWord;
case '>':
ch_getCh();
if(ch=='=') {
myWord.setTypenum(24);
myWord.setWord(">=");
return myWord;
}
re();
myWord.setTypenum(23);
myWord.setWord(">");
return myWord;
case ';':
myWord.setTypenum(26);
myWord.setWord(";");
return myWord;
case '(':
myWord.setTypenum(27);
myWord.setWord("(");
return myWord;
case ')':
myWord.setTypenum(28);
myWord.setWord(")");
return myWord;
case '
':
myWord.setTypenum(30);
myWord.setWord("\
");
return myWord;
case '#':
myWord.setTypenum(0);
myWord.setWord("#");
return myWord;
default:
concat();
myWord.setTypenum(-1);
myWord.setWord(" \"" + new String(token).trim() + "\"");
return myWord;
}
}

}


main :
import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;

public class main {
private File inputFile;
private File outputFile;
private String fileContent;
private ArrayList list = new ArrayList<>();
public main(String input,String output) {
inputFile = new File(input);
outputFile = new File(output);
}

public String getContent() {
StringBuilder stringBuilder = new StringBuilder();
try(Scanner reader = new Scanner(inputFile)) {
while (reader.hasNextLine()) {
String line = reader.nextLine();
stringBuilder.append(line + "
");
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return fileContent = stringBuilder.toString();
}

public void analyze(String fileContent) {
int over = 1;
word word = new word();
keywords scanner = new keywords(fileContent.toCharArray());
while (over != 0) {
word = scanner.scan();
list.add(word);
over = word.getTypenum();
} saveResult();
}

public void saveResult() {
if (!outputFile.exists())
try {
outputFile.createNewFile();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try(Writer writer = new FileWriter(outputFile)){
for (word word : list) {
writer.write("(" + word.getTypenum() + " ," + word.getWord() + ")
");
}
} catch (IOException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
main Mains = new main("C:\\Users\\ \\Desktop\\1.txt","C:\\Users\\ \\Desktop\\output.txt");
Mains.analyze(Mains.getContent());
}
}

1.txt:
int main(){
 int n,i,j,k;
 printf(" :");
 scanf("%d",&n);
 struct student Stu[n];
 
 for(i=0;i  printf(" %d , :
",i+1);
  printf("    
");
  scanf("%s %d %d",Stu[i].name,&Stu[i].num,&Stu[i].cj);
 }
 for(i=0;i  for(j=0;j   if(Stu[j].cj   {
    t=Stu[j];
    Stu[j]=Stu[j+1];
    Stu[j+1]=t;
   }
   printf(" :
");
   for(i=0;i    printf("%s %d %d
",Stu[i].name,Stu[i].num,Stu[i].cj);
   }
 #

output.txt :
(10 ,int)
(10 ,main)
(27 ,()
(28 ,))
(32 ,{)
(30 ,
)
(10 ,int)
(10 ,n)
(-1 , ",")
(10 ,i)
(-1 , ",")
(10 ,j)
(-1 , ",")
(10 ,k)
(26 ,;)
(30 ,
)
(10 ,printf)
(27 ,()
(-1 , """)
(-1 , " ")
(-1 , " ")
(-1 , " ")
(-1 , " ")
(-1 , " ")
(-1 , " ")
(-1 , " ")
(-1 , ":")
(-1 , """)
(28 ,))
(26 ,;)
(30 ,
)
(10 ,scanf)
(27 ,()
(-1 , """)
(-1 , "%")
(10 ,d)
(-1 , """)
(-1 , ",")
(-1 , "&")
(10 ,n)
(28 ,))
(26 ,;)
(30 ,
)
(10 ,struct)
(10 ,student)
(10 ,Stu)
(-1 , "[")
(10 ,n)
(-1 , "]")
(26 ,;)
(30 ,
)
(30 ,
)
(10 ,for)
(27 ,()
(10 ,i)
(25 ,=)
(11 ,)
(26 ,;)
(10 ,i)
(20 ,(10 ,n)
(26 ,;)
(10 ,i)
(13 ,+)
(13 ,+)
(28 ,))
(32 ,{)
(30 ,
)
(10 ,printf)
(27 ,()
(-1 , """)
(-1 , " ")
(-1 , " ")
(-1 , " ")
(-1 , " ")
(-1 , " ")
(-1 , " ")
(-1 , " ")
(-1 , "%")
(10 ,d)
(-1 , " ")
(-1 , " ")
(-1 , " ")
(-1 , " ")
(-1 , " ")
(-1 , ",")
(-1 , " ")
(-1 , " ")
(-1 , " ")
(-1 , " ")
(-1 , " ")
(17 ,:)
(-1 , "\")
(10 ,n)
(-1 , """)
(-1 , ",")
(10 ,i)
(13 ,+)
(11 ,1)
(28 ,))
(26 ,;)
(30 ,
)
(10 ,printf)
(27 ,()
(-1 , """)
(-1 , " ")
(-1 , " ")
(-1 , " ")
(-1 , " ")
(-1 , " ")
(-1 , " ")
(-1 , "\")
(10 ,n)
(-1 , """)
(28 ,))
(26 ,;)
(30 ,
)
(10 ,scanf)
(27 ,()
(-1 , """)
(-1 , "%")
(10 ,s)
(-1 , "%")
(10 ,d)
(-1 , "%")
(10 ,d)
(-1 , """)
(-1 , ",")
(10 ,Stu)
(-1 , "[")
(10 ,i)
(-1 , "]")
(-1 , ".")
(10 ,name)
(-1 , ",")
(-1 , "&")
(10 ,Stu)
(-1 , "[")
(10 ,i)
(-1 , "]")
(-1 , ".")
(10 ,num)
(-1 , ",")
(-1 , "&")
(10 ,Stu)
(-1 , "[")
(10 ,i)
(-1 , "]")
(-1 , ".")
(10 ,cj)
(28 ,))
(26 ,;)
(30 ,
)
(33 ,})
(30 ,
)
(10 ,for)
(27 ,()
(10 ,i)
(25 ,=)
(11 ,)
(26 ,;)
(10 ,i)
(20 ,(10 ,n)
(14 ,-)
(11 ,1)
(26 ,;)
(10 ,i)
(13 ,+)
(13 ,+)
(28 ,))
(30 ,
)
(10 ,for)
(27 ,()
(10 ,j)
(25 ,=)
(11 ,)
(26 ,;)
(10 ,j)
(20 ,(10 ,n)
(14 ,-)
(10 ,i)
(14 ,-)
(11 ,1)
(26 ,;)
(10 ,j)
(13 ,+)
(13 ,+)
(28 ,))
(30 ,
)
(2 ,if)
(27 ,()
(10 ,Stu)
(-1 , "[")
(10 ,j)
(-1 , "]")
(-1 , ".")
(10 ,cj)
(20 ,(10 ,Stu)
(-1 , "[")
(10 ,j)
(13 ,+)
(11 ,1)
(-1 , "]")
(-1 , ".")
(10 ,cj)
(28 ,))
(30 ,
)
(32 ,{)
(30 ,
)
(10 ,t)
(25 ,=)
(10 ,Stu)
(-1 , "[")
(10 ,j)
(-1 , "]")
(26 ,;)
(30 ,
)
(10 ,Stu)
(-1 , "[")
(10 ,j)
(-1 , "]")
(25 ,=)
(10 ,Stu)
(-1 , "[")
(10 ,j)
(13 ,+)
(11 ,1)
(-1 , "]")
(26 ,;)
(30 ,
)
(10 ,Stu)
(-1 , "[")
(10 ,j)
(13 ,+)
(11 ,1)
(-1 , "]")
(25 ,=)
(10 ,t)
(26 ,;)
(30 ,
)
(33 ,})
(30 ,
)
(10 ,printf)
(27 ,()
(-1 , """)
(-1 , " ")
(-1 , " ")
(-1 , " ")
(-1 , " ")
(-1 , " ")
(-1 , " ")
(-1 , " ")
(17 ,:)
(-1 , "\")
(10 ,n)
(-1 , """)
(28 ,))
(26 ,;)
(30 ,
)
(10 ,for)
(27 ,()
(10 ,i)
(25 ,=)
(11 ,)
(26 ,;)
(10 ,i)
(20 ,(10 ,n)
(26 ,;)
(10 ,i)
(13 ,+)
(13 ,+)
(28 ,))
(32 ,{)
(30 ,
)
(10 ,printf)
(27 ,()
(-1 , """)
(-1 , "%")
(10 ,s)
(-1 , "%")
(10 ,d)
(-1 , "%")
(10 ,d)
(-1 , "\")
(10 ,n)
(-1 , """)
(-1 , ",")
(10 ,Stu)
(-1 , "[")
(10 ,i)
(-1 , "]")
(-1 , ".")
(10 ,name)
(-1 , ",")
(10 ,Stu)
(-1 , "[")
(10 ,i)
(-1 , "]")
(-1 , ".")
(10 ,num)
(-1 , ",")
(10 ,Stu)
(-1 , "[")
(10 ,i)
(-1 , "]")
(-1 , ".")
(10 ,cj)
(28 ,))
(26 ,;)
(30 ,
)
(33 ,})
(30 ,
)
(0 ,#)
C ,

좋은 웹페이지 즐겨찾기