구문 분석기 Java 버전

3215 단어 컴파일링 원리
더 많은 내용을 알고 싶으면 컴파일 원리란으로 옮겨라
컴파일러 원리 실험2, 문법 분석기
이 글에서 사용한 코드에서 부족한 부분은 저의 이전 글, 문법 분석기 자바 버전을 참고해야 합니다.
왜냐하면 문법 분석기는 어법 분석기의 기초 위에 세워진 것이다
텍스트 링크https://blog.csdn.net/godelgnis/article/details/83218139
package codescanner;

import java.util.ArrayList;

public class IrParser {

	private Analyzer analyzer;
	private ArrayList list = new ArrayList<>();
	private Word word;
	private int index = 0; //            
	private boolean error = false;

	public IrParser() {
		analyzer = new Analyzer("input.txt", "output.txt");
		analyzer.analyze(analyzer.getContent());
		list = analyzer.getList();
	}

	public void parse() {
		word = getNext(list);
		if (word.getTypenum() == 1) {
			word = getNext(list);
			pretreatment();
			if (word.getTypenum() == 6) {
				word = getNext(list);
				if (word.getTypenum() == 0 && !error) {
					System.out.println("success");
				}

			} else {
				if (!error) {
					error = true;
					System.out.println(" end  ");
				}
			}
		}else {
			error = true;
			System.out.println("begin  ");
		}
	}

	public void pretreatment() {
		statement();
		while (word.getTypenum() == 26) {
			word = getNext(list);
			statement();
		}
	}

	public void statement() {
		if (word.getTypenum() == 10) {
			word = getNext(list);
			if (word.getTypenum() == 18) {
				word = getNext(list);
				expression();
			} else {
				error = true;
				System.out.println("     ");
			}
		} else {
			error = true;
			System.out.println("    ");
		}
	}

	public void expression() {
		term();
		while (word.getTypenum() == 13 || word.getTypenum() == 14) {
			word = getNext(list);
			term();
		}
	}

	public void term() {
		factor();
		while (word.getTypenum() == 15 || word.getTypenum() == 16) {
			word = getNext(list);
			factor();
		}
	}

	public void factor() {
		if (word.getTypenum() == 10 || word.getTypenum() == 11) {
			word = getNext(list);
		} else if (word.getTypenum() == 27) {
			word = getNext(list);
			expression();
			if (word.getTypenum() == 28) {
				word = getNext(list);
			} else {
				error = true;
				System.out.println("')'  ");
			}
		} else {
			error = true;
			System.out.println("     ");
		}
	}

	public Word getNext(ArrayList list) {
		if (index < list.size()) {
			return list.get(index++);
		} else {
			return null;
		}
	}

	public int getIndex() {
		return index;
	}

	public void setIndex(int index) {
		this.index = index;
	}

	public static void main(String[] args) {
		IrParser parser = new IrParser();
		parser.parse();
	}
}

테스트 데이터
//      
//begin a:=9; x:=2*3; b:=a+x end #

// begin  
//x:=a+b*c end #

// end  
//begin x:=a+b*c #

//     
//begin a:=; x:=2*3; b:=a+x end #

//      
//begin a==9; x:=2*3; b:=a+x end #

//')'  
//begin a:=9; x:=2*3; b:=(a+x*c end #

//    
//begin if a>0 then a:=1 end #

한 번에 하나의 오류만 테스트할 수 있으며, 테스트하기 전에 대응하는 코드의 주석을 제거해야 한다.
어법 분석은 주석을 제거하는 기능을 한다
이 문법 분석기는 Begin으로 시작하고end로 시작하며 #로 파일로 끝나는 기호를 부여하는 문장을 분석한다
만약 값 부여 문장이 잘못되면 상응하는 오류 근거를 제시할 것이다

관중 여러분, 제가 보기에는 그래도 잘 썼으니, 저에게 좋아요를 눌러도 될 것 같습니다

좋은 웹페이지 즐겨찾기