구문 분석기 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로 시작하며 #로 파일로 끝나는 기호를 부여하는 문장을 분석한다
만약 값 부여 문장이 잘못되면 상응하는 오류 근거를 제시할 것이다
관중 여러분, 제가 보기에는 그래도 잘 썼으니, 저에게 좋아요를 눌러도 될 것 같습니다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
귀속 하강 식별기-컴파일링 원리작업용 단순화 반복 감소 인식기: 예: 문법 G[S]: S-> A|B M->A|# B->bN N->B|# ①문법은 좌귀속을 포함하지 않는다 follow 아니요 {a,b} 아니요 아니요 {b} 예. 예. {b,#} ①...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.