Advertisement
Guest User

Untitled

a guest
Oct 16th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.82 KB | None | 0 0
  1. package enshud.s4.compiler;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.List;
  6.  
  7. public class NewCaslGenerator {
  8.  
  9.     private List<Intermediate> intermediateList;
  10.     private List<List<List<String>>> basicBlockList;
  11.     private List<HashMap<String, SymbolTableElement>> varList;
  12.     private List<String> casl = new ArrayList<>();
  13.     private GRList grList = new GRList();
  14.    
  15.     // CASL生成用変数
  16.     private int prgNumber; // プログラム(0)->副プログラム1(1)->副プログラム2(2)...
  17.     private int wholeLine; // プログラム全体での行目 (0, 1, 2,...)
  18.     private int line; // 基本ブロック内での行目 (0, 1, 2,...)
  19.    
  20.     public NewCaslGenerator(List<Intermediate> l, List<HashMap<String, SymbolTableElement>> v) {
  21.         intermediateList = l;
  22.         varList = v;
  23.         basicBlockList = getBasicBlockList();
  24.        
  25.     }
  26.    
  27.     private void generateCaslCode() {
  28.        
  29.     }
  30.    
  31.    
  32.    
  33.     private List<List<List<String>>> getBasicBlockList() {
  34.         List<List<List<String>>> basicBlockList = new ArrayList<>();
  35.        
  36.         for(Intermediate im: intermediateList) {
  37.             List<List<String>> basicBlock = new ArrayList<>();
  38.             for(List<String> ls: im.getCode()) {
  39.                 if(ls.get(0).equals("if") || ls.get(0).equals("goto")) {
  40.                     basicBlockList.add(basicBlock);
  41.                     basicBlock = new ArrayList<>();
  42.                     basicBlock.add(ls);
  43.                 }else {
  44.                     basicBlock.add(ls);
  45.                 }
  46.             }
  47.            
  48.         }
  49.        
  50.         return basicBlockList;
  51.     }
  52.    
  53.     private void printBasicBlock() {
  54.         for(List<List<String>> list: basicBlockList) {
  55.             System.out.println("============basicBlock - START ===========");
  56.             for(List<String> ls: list) {
  57.                 for(String s: ls) {
  58.                     System.out.print(s + " ");
  59.                 }
  60.                 System.out.println();
  61.             }
  62.             System.out.println("============basicBlock - END===========");
  63.         }
  64.     }
  65.    
  66.     private boolean isVarUsedAfterinBlock(List<List<String>> basicBlock, String var) {
  67.         for(int i=line+1; i<basicBlock.size(); i++) {
  68.             if(basicBlock.get(i).lastIndexOf(var) > 0) return true;
  69.         }
  70.         return false;
  71.     }
  72.    
  73.     private String getLastUsedVar(List<List<String>> basicBlock) {
  74.         // GR1-5に格納されている変数を取得 ->どれが一番遅く参照されるかを評価
  75.         List<String> grVar = new ArrayList<>();
  76.         String lastVar = null;
  77.         for(int i=0; i<5; i++) {
  78.             grVar.add(grList.getContainedVar("GR" + (i+1)));
  79.         }
  80.         for(List<String> exp: basicBlock) {
  81.             // 中間コードのList<String>で1番目以降の要素についてgrVarの要素を探す
  82.             int i = 0;
  83.             for(String s: exp) {
  84.                 if(i > 0) {
  85.                     if(grVar.contains(s) && !s.matches("^(t1|t2|t3|t4|t5)$")) grVar.remove(s);
  86.                     lastVar = s;
  87.                 }
  88.                 i++;
  89.             }
  90.         }
  91.         return lastVar;
  92.     }
  93.    
  94.     private int getOffset(String var) {
  95.         int offset,i;
  96.         if(var.matches("\\[[0-9]+\\]")) {
  97.             // 添字付き変数 a[数字]
  98.             SymbolTableElement element = varList.get(prgNumber).get(var.substring(0, var.indexOf("[")));
  99.             i = Integer.parseInt(var.substring(var.indexOf("[")+1, var.indexOf("]")));
  100.             offset = element.getOffset() + element.getSize() * i;
  101.         }else {
  102.             SymbolTableElement element = varList.get(prgNumber).get(var);
  103.             if(element != null) {
  104.                 offset = element.getOffset();
  105.             }else {
  106.                 offset = -1;
  107.             }
  108.         }
  109.         return offset;
  110.     }
  111.    
  112.     private String getXLocate(String x, String y) {
  113.        
  114.     }
  115.    
  116.     private String getYLocate(String y) {
  117.        
  118.     }
  119.    
  120.     private void storeYtoX(String xLocate, String yLocate) {
  121.        
  122.     }
  123.    
  124.     private void setVarWithSuffixOffsetinGR2(String var, int i) {
  125.         // var[i]のオフセットをGR2に格納する
  126.     }
  127.    
  128.     private void setVarWithSuffixOffsetinGR1(String var, int i) {
  129.         // var[i]のオフセットをGR1に格納する
  130.     }
  131.    
  132.     private void forceToSetVartoGR(String grName, String y) {
  133.         // grNameにyの内容をなんとしてでも格納する
  134.     }
  135.    
  136.     private void genCopySentence() {
  137.         // x := y size=4
  138.     }
  139.    
  140.     private void genAssignmentSentence() {
  141.         // x := y op z size=5
  142.     }
  143.    
  144.     private void genAssignmentSentenceAddSubAndOr() {
  145.         // x := y (+|-|and|or) z
  146.     }
  147.    
  148.     private void genAssignmentSentenceMul() {
  149.         // x := y * z
  150.     }
  151.    
  152.     private void genAssignmentSentenceDiv() {
  153.         // x := y div(/) z
  154.     }
  155.    
  156.     private void genAssignmentSentenceMod() {
  157.         // x := y mod z
  158.     }
  159.    
  160.     private void genAssignmentSentence4() {
  161.         // x := op y size=4
  162.     }
  163.    
  164.     private void genUnconditionalJumpSentence() {
  165.         // goto Ln size=2
  166.     }
  167.    
  168.     private void genConditionalJumpSentence() {
  169.         // if x rop y goto Ln size=6
  170.     }
  171.    
  172.     private void genLabelSentence() {
  173.         // (Ln : |subproc :) size=2
  174.     }
  175.    
  176.     private void genParameterSentence() {
  177.         // param v size=2
  178.     }
  179.    
  180.     private void genReturnSentence() {
  181.         // return size=1
  182.     }
  183.    
  184.     private void genCallSubProgramSentence() {
  185.         // call p n size=3
  186.     }
  187.    
  188.     private void genIOSentence() {
  189.         // write/read size=1
  190.     }
  191.    
  192.     private void returnMemory() {
  193.         // 基本ブロックの終わりで呼び出す
  194.     }
  195.    
  196.    
  197.    
  198. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement