컴 파일 원리 작업 5
문법 분석 프로그램 (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 ,
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.