📄 ll1parse.java
字号:
package cminusCompiler;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Stack;
/**
* @author tanfei E-mail:tanfei158876110@163.com
* @version Create Time:2007-12-9 上午09:51:11 description:
*/
public class LL1Parse {
private HashMap<String, Integer> ter;
private HashMap<String, Integer> nont;
private Stack<InputLine> input = new Stack<InputLine>();
private Stack<String> parse = new Stack<String>();
private LinkedList[][] table;
public LL1Parse(HashMap<String, Integer> ter, HashMap<String, Integer> nont,
Stack<InputLine> input, Stack<String> parse, LinkedList[][] table) {
this.ter = ter;
this.nont = nont;
this.input = input;
this.parse = parse;
this.table = table;
}
public void parseTheInput(boolean trace){
boolean conti = true;
while(loopCondition()){
if(choiceCondition1()){
System.out.println("Match: " + parse.peek() + " " + input.peek().getInputToken());
parse.pop();
input.pop();
}else if(choiceCondition2()){
generate(trace);
}
else{
printError();
conti = false;
break;
}
}
if(input.peek().getInputToken().equals("EOF")){
System.out.println("No syntax error in the file!");
}else if(conti){
printError();
}
}
private boolean loopCondition(){
if(parse.isEmpty()){
return false;
}
if(input.peek().getInputToken().equals("EOF")){
return false;
}
return true;
}
private void generate(boolean trace){
int i, j, count;
String nonter;
InputLine line;
LinkedList tempList;
nonter = parse.pop();
line = input.peek();
i = nont.get(nonter);
j = ter.get(line.getInputToken());
tempList = table[i][j];
count = tempList.size() - 1;
if(trace){
System.out.println(nonter + ":");
}
for(; count >= 0; count--){
parse.push((String) tempList.get(count));
if(trace){
System.out.print((String) tempList.get(count) + " ");
}
}
check();
if(trace){
System.out.println();
System.out.println("input stack top element: " + input.peek().getInputToken());
}
System.gc();
}
private void check(){
if(parse.peek().equals("empty")){
parse.pop();
}
}
private boolean choiceCondition1(){
String topParse;
topParse = parse.peek();
if(!ter.containsKey(topParse)){
return false;
}else if(input.peek().getInputToken().equals(topParse)){
return true;
}
return false;
}
private boolean choiceCondition2(){
String topParse;
LinkedList tempList;
int i, j;
topParse = parse.peek();
if(!nont.containsKey(topParse)){
return false;
}else if(!ter.containsKey(input.peek().getInputToken())){
return false;
}else{
i = nont.get(topParse);
j = ter.get(input.peek().getInputToken());
tempList = table[i][j];
if(table[i][j].size() != 0){
return true;
}
}
return false;
}
private void printError(){
InputLine line;
int errorLine;
line = input.peek();
errorLine = line.getLineNo();
System.out.println("Error in line: " + errorLine);
//System.exit(1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -