Академический Документы
Профессиональный Документы
Культура Документы
on
CLR PARSER USING JAVA
By
DIVYA DASIKA
1602-16-733-009
EESHA CHAWHAN
1602-16-733-009
2018-19
SOURCE CODE
LR1item.java
package lr1;
import lr0.LR0Item;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Objects;
this.rightSide = rightSide;
this.dotPointer = dotPointer;
this.lookahead = lookahead;
if(dotPointer == rightSide.length){
return null;
return rightSide[dotPointer];
boolean goTo() {
return false;
dotPointer++;
return true;
return rightSide;
return lookahead;
return leftSide;
this.lookahead = lookahead;
this.rightSide = rightSide;
}
@Override
Arrays.equals(rightSide, lr1Item.rightSide);
@Override
int hash = 7;
return hash;
@Override
if (i == dotPointer) {
str += ".";
str += rightSide[i];
if (rightSide.length == dotPointer) {
str += ".";
return str;
}
}
LR1parser.java
package lr1;
import lr0.LR0Item;
import util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
super(grammar);
startLockahead.add("$");
start.add(new
LR1Item(startRule.getLeftSide(),startRule.getRightSide(),0,startLockahead));
canonicalCollection.add(startState);
if (item.getCurrent() != null) {
stringWithDot.add(item.getCurrent());
if (canonicalCollection.get(j).getItems().containsAll(nextState.getItems())
&&
nextState.getItems().containsAll(canonicalCollection.get(j).getItems())) {
isExist = true;
canonicalCollection.get(i).getTransition().put(str,
canonicalCollection.get(j));
if (!isExist) {
canonicalCollection.add(nextState);
canonicalCollection.get(i).getTransition().put(str, nextState);
}
public boolean parseCLR1(){
createStatesForCLR1();
createGoToTable();
return createActionTable();
createStatesForLALR1();
createGoToTable();
return createActionTable();
createStatesForCLR1();
for(LR1Item item:canonicalCollection.get(i).getItems()){
itemsi.add(new
LR0Item(item.getLeftSide(),item.getRightSide(),item.getDotPointer()));
for(LR1Item item:canonicalCollection.get(j).getItems()){
itemsj.add(new
LR0Item(item.getLeftSide(),item.getRightSide(),item.getDotPointer()));
if(itemi.equalLR0(itemj)){
itemi.getLookahead().addAll(itemj.getLookahead());
break;
for(String s : canonicalCollection.get(k).getTransition().keySet()){
if(canonicalCollection.get(k).getTransition().get(s).getItems().containsAll(canonicalC
ollection.get(j).getItems()) &&
canonicalCollection.get(j).getItems().containsAll(canonicalCollection.get(k).getTrans
ition().get(s).getItems())){
canonicalCollection.get(k).getTransition().put(s,canonicalCollection.get(i));
}
}
canonicalCollection.remove(j);
j--;
temp.add(canonicalCollection.get(i));
canonicalCollection = temp;
if (grammar.isVariable(s)) {
goToTable[i].put(s,
findStateIndex(canonicalCollection.get(i).getTransition().get(s)));
}
}
if (canonicalCollection.get(i).equals(state)) {
return i;
return -1;
if (grammar.getTerminals().contains(s)) {
if (item.getDotPointer() == item.getRightSide().length) {
if (item.getLeftSide().equals("S'")) {
} else {
if (actionTable[i].get(str) != null) {
return false;
} else {
actionTable[i].put(str, action);
}
}
return true;
str += canonicalCollection.get(i)+"\n";
return str;
}
LR1state.java
package lr1;
import util.Grammar;
import util.Rule;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Objects;
closure(grammar);
}
private void closure(Grammar grammar) {
do {
changeFlag = false;
lookahead.addAll(item.getLookahead());
}else{
HashSet<String> firstSet =
grammar.computeFirst(item.getRightSide(),item.getDotPointer()+1);
if(firstSet.contains("epsilon")){
firstSet.remove("epsilon");
firstSet.addAll(item.getLookahead());
lookahead.addAll(firstSet);
HashSet<Rule> rules =
grammar.getRuledByLeftVariable(item.getCurrent());
if(!items.containsAll(temp)){
items.addAll(temp);
changeFlag = true;
} while (changeFlag);
return transition;
return items;
@Override
for(LR1Item item:items){
s += item + "\n";
return s;
}
Action.java
package util;
this.type = type;
this.operand = operand;
@Override
return type;
return operand;
}
Actiontype.java
package util;
ACCEPT,SHIFT,REDUCE
grammar.java
package util;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Objects;
public Grammar(String s) {
int line = 0;
for(String st : s.split("\n")){
variables.add(leftSide);
terminals.add(terminal);
}
if (line == 0) {
startVariable = leftSide;
line++;
terminals.remove(variable);
System.out.println("Rules: ");
computeFirstSets();
computeFollowSet();
if(rules.get(i).equals(rule)){
return i;
return -1;
return variables;
return startVariable;
firstSets.put(s, temp);
while (true) {
if (rule.getLeftSide().equals(variable)) {
firstSet.addAll(addAll);
if (!firstSets.get(variable).containsAll(firstSet)) {
isChanged = true;
firstSets.get(variable).addAll(firstSet);
if (!isChanged) {
break;
firstSets.put("S'", firstSets.get(startVariable));
fallowSets.put(s, temp);
start.add("$");
fallowSets.put("S'", start);
while (true) {
if (i == rule.getRightSide().length - 1) {
fallowSets.get(variable).addAll(fallowSets.get(rule.leftSide));
} else {
if (first.contains("epsilon")) {
first.remove("epsilon");
first.addAll(fallowSets.get(rule.leftSide));
if (!fallowSets.get(variable).containsAll(first)) {
isChange = true;
fallowSets.get(variable).addAll(first);
if (!isChange) {
break;
}
}
if (index == string.length) {
return first;
if (terminals.contains(string[index])) {
first.add(string[index]);
return first;
if (variables.contains(string[index])) {
first.add(str);
if (first.contains("epsilon")) {
if (index != string.length - 1) {
first.remove("epsilon");
}
return first;
if (rule.getLeftSide().equals(variable)) {
variableRules.add(rule);
return variableRules;
return variables.contains(s);
return firstSets;
}
public HashMap<String, HashSet<String>> getFallowSets() {
return fallowSets;
return terminals;
@Override
int hash = 3;
return hash;
@Override
if (this == obj) {
return true;
}
if (obj == null) {
return false;
if (getClass() != obj.getClass()) {
return false;
if (!Objects.equals(this.rules, other.rules)) {
return false;
if (!Objects.equals(this.terminals, other.terminals)) {
return false;
if (!Objects.equals(this.variables, other.variables)) {
return false;
return true;
@Override
return str;
}
Actiontype.java
package util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Stack;
this.grammar = grammar;
int index = 0;
stack.add("0");
if(action == null){
return false;
stack.push(nextInput);
stack.push(action.getOperand()+"");
index++;
stack.pop();
}
int nextState = Integer.valueOf(stack.peek());
stack.push(leftSide);
stack.push(variableState+"");
return true;
return false;
str += String.format("%-6s",variable);
str += "\n";
str += "-";
}
str += "\n";
str += String.format("|%-6s|",i);
str += "\n";
str += "-";
return str;
terminals.add("$");
}
str += "\n";
str += "-";
str += "\n";
str += String.format("|%-10s|",i);
str += "\n";
str += "-";
return str;
return grammar;
}}
Rule.java
package util;
import java.util.Arrays;
import java.util.Objects;
this.rightSide = rightSide;
this.leftSide = leftSide;
this.leftSide = rule.getLeftSide();
this.rightSide = rule.rightSide.clone();
return rightSide;
@Override
int hash = 3;
return hash;
@Override
if (this == obj) {
return true;
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
if (!Objects.equals(this.leftSide, other.leftSide)) {
return false;
if (!Arrays.deepEquals(this.rightSide, other.rightSide)) {
return false;
return true;
@Override
return str;
}}
Main.java
package gui;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
@Override
Parent root =
FXMLLoader.load(getClass().getResource("GrammarInput.fxml"));
primaryStage.setTitle("LR Parser");
primaryStage.setScene(new Scene(root));
primaryStage.show();
launch(args);
}
OUTPUT SCREENSHOTS