Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package enshud.s4.compiler;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- public class NewCaslGenerator {
- private List<Intermediate> intermediateList;
- private List<List<List<String>>> basicBlockList;
- private List<HashMap<String, SymbolTableElement>> varList;
- private List<String> casl = new ArrayList<>();
- private GRList grList = new GRList();
- // CASL生成用変数
- private int prgNumber; // プログラム(0)->副プログラム1(1)->副プログラム2(2)...
- private int wholeLine; // プログラム全体での行目 (0, 1, 2,...)
- private int line; // 基本ブロック内での行目 (0, 1, 2,...)
- public NewCaslGenerator(List<Intermediate> l, List<HashMap<String, SymbolTableElement>> v) {
- intermediateList = l;
- varList = v;
- basicBlockList = getBasicBlockList();
- }
- private void generateCaslCode() {
- }
- private List<List<List<String>>> getBasicBlockList() {
- List<List<List<String>>> basicBlockList = new ArrayList<>();
- for(Intermediate im: intermediateList) {
- List<List<String>> basicBlock = new ArrayList<>();
- for(List<String> ls: im.getCode()) {
- if(ls.get(0).equals("if") || ls.get(0).equals("goto")) {
- basicBlockList.add(basicBlock);
- basicBlock = new ArrayList<>();
- basicBlock.add(ls);
- }else {
- basicBlock.add(ls);
- }
- }
- }
- return basicBlockList;
- }
- private void printBasicBlock() {
- for(List<List<String>> list: basicBlockList) {
- System.out.println("============basicBlock - START ===========");
- for(List<String> ls: list) {
- for(String s: ls) {
- System.out.print(s + " ");
- }
- System.out.println();
- }
- System.out.println("============basicBlock - END===========");
- }
- }
- private boolean isVarUsedAfterinBlock(List<List<String>> basicBlock, String var) {
- for(int i=line+1; i<basicBlock.size(); i++) {
- if(basicBlock.get(i).lastIndexOf(var) > 0) return true;
- }
- return false;
- }
- private String getLastUsedVar(List<List<String>> basicBlock) {
- // GR1-5に格納されている変数を取得 ->どれが一番遅く参照されるかを評価
- List<String> grVar = new ArrayList<>();
- String lastVar = null;
- for(int i=0; i<5; i++) {
- grVar.add(grList.getContainedVar("GR" + (i+1)));
- }
- for(List<String> exp: basicBlock) {
- // 中間コードのList<String>で1番目以降の要素についてgrVarの要素を探す
- int i = 0;
- for(String s: exp) {
- if(i > 0) {
- if(grVar.contains(s) && !s.matches("^(t1|t2|t3|t4|t5)$")) grVar.remove(s);
- lastVar = s;
- }
- i++;
- }
- }
- return lastVar;
- }
- private int getOffset(String var) {
- int offset,i;
- if(var.matches("\\[[0-9]+\\]")) {
- // 添字付き変数 a[数字]
- SymbolTableElement element = varList.get(prgNumber).get(var.substring(0, var.indexOf("[")));
- i = Integer.parseInt(var.substring(var.indexOf("[")+1, var.indexOf("]")));
- offset = element.getOffset() + element.getSize() * i;
- }else {
- SymbolTableElement element = varList.get(prgNumber).get(var);
- if(element != null) {
- offset = element.getOffset();
- }else {
- offset = -1;
- }
- }
- return offset;
- }
- private String getXLocate(String x, String y) {
- }
- private String getYLocate(String y) {
- }
- private void storeYtoX(String xLocate, String yLocate) {
- }
- private void setVarWithSuffixOffsetinGR2(String var, int i) {
- // var[i]のオフセットをGR2に格納する
- }
- private void setVarWithSuffixOffsetinGR1(String var, int i) {
- // var[i]のオフセットをGR1に格納する
- }
- private void forceToSetVartoGR(String grName, String y) {
- // grNameにyの内容をなんとしてでも格納する
- }
- private void genCopySentence() {
- // x := y size=4
- }
- private void genAssignmentSentence() {
- // x := y op z size=5
- }
- private void genAssignmentSentenceAddSubAndOr() {
- // x := y (+|-|and|or) z
- }
- private void genAssignmentSentenceMul() {
- // x := y * z
- }
- private void genAssignmentSentenceDiv() {
- // x := y div(/) z
- }
- private void genAssignmentSentenceMod() {
- // x := y mod z
- }
- private void genAssignmentSentence4() {
- // x := op y size=4
- }
- private void genUnconditionalJumpSentence() {
- // goto Ln size=2
- }
- private void genConditionalJumpSentence() {
- // if x rop y goto Ln size=6
- }
- private void genLabelSentence() {
- // (Ln : |subproc :) size=2
- }
- private void genParameterSentence() {
- // param v size=2
- }
- private void genReturnSentence() {
- // return size=1
- }
- private void genCallSubProgramSentence() {
- // call p n size=3
- }
- private void genIOSentence() {
- // write/read size=1
- }
- private void returnMemory() {
- // 基本ブロックの終わりで呼び出す
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement