- ベストアンサー
レイアウトファイルのデータ整形機能の実装方法について
- レイアウトファイルから指定された条件に基づいてデータを整形する機能の実装方法について相談です。
- 現在、レイアウトファイルを読み込み、指定された条件に基づいてデータを整形する機能を開発中ですが、実装方法が分からず困っています。
- 具体的には、指定された条件に基づいてグループと繰り返し処理を実装する必要がありますが、どのように実装すれば良いかわかりません。ご教授いただけると助かります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
「Interpreterパターンの構文木」を作る方法も、 わかりやすいですね・・・。 class Element{void execute(){}} class Group extends Element{ int repeat; Vector children=new Vector(); Group(){this(1);} Group(int p){repeat=p;} void add(Element e){children.add(e);} void execute(){ for(int i=0;i<repeat;i++){//繰り返し for(int j=0;j<children.size();j++){ //子へ委譲 ((Element)children.elementAt(j)).execute(); } } } } class Print extends Element{ String message; Print(String p){message=p;} void execute(){System.out.print(message);} } public class Demo{ Inst inst; int pos; /*スクリプト*/ Inst[] script={ new Inst("PRINT","Z") ,new Inst("GROUP",2) ,new Inst("PRINT","A") ,new Inst("GROUP",3) ,new Inst("PRINT","B") ,new Inst("PRINT","C") ,new Inst("GROUP_END") ,new Inst("GROUP_END") }; void get(){ if(pos==script.length){inst=null;return;} inst=script[pos++]; } void inGroup(Group parent/*親ノード*/){ while(true){ get(); if(null==inst){break;} String type=inst.type; if("GROUP".equals(type)){ Group g=new Group(inst.intOperand); parent.add(g); inGroup(g);//再帰 }else if("PRINT".equals(type)){ parent.add(new Print(inst.strOperand)); }else if("GROUP_END".equals(type)){ break; } } } void parse(Group root){inGroup(root);} public static void main(String[] args){ Group root =new Group();//ルートノード (new Demo()).parse(root);//パース root.execute();//実行 System.out.println(""); } }
その他の回答 (1)
- kacchann
- ベストアンサー率58% (347/594)
素人です。 専門知識を持ち合わせていませんが、悪しからずお願いします。 --- GROUP 3 PRINT "hello,world" GROUP_END というようなスクリプトを解釈するデモプログラムを書いてみました。 "(GROUPの)入れ子"をうまく処理するのに、Stackを利用。 ネット上にある「BASICインタプリタ」のFOR~NEXT文処理を参考にしました。 <思ったこと> ・「GROUP開始命令」と対になる、「GROUP終了命令」も作ったほうが、 パーサを書く際、考えやすいかも。 ・もともとのスクリプト(のパーサを書くの)が考えにくければ、 "前処理"として、 いったん"自分の考えやすい中間的なスクリプト"に変換しておく という手も。 (たとえば質問者さんが掲示された"レイアウトファイル"の "G010の行"の前に一行、「GROUP終了に相当する命令」を加えるのは容易) ・どうしてもパーサが書けないなら、とりあえずxmlで。 --- import java.io.*; import java.util.*; class Data{ int pos; int data1=1; int data2; Data(int p,int d){pos=p;data2=d;} } class Inst{ String type; int intOperand; String strOperand; Inst(String t){type=t;} Inst(String t,int o){type=t;intOperand=o;} Inst(String t,String o){type=t;strOperand=o;} } public class Demo{ Inst inst; int pos;//プログラムの位置 Inst[] arr={ new Inst("GROUP",3) ,new Inst("PRINT","hello, world") ,new Inst("GROUP_END") }; Stack stack=new Stack(); void get(){ if(pos==arr.length){inst=null;return;} inst=arr[pos++]; } void parse(){ while(true){ get(); if(null==inst){break;} int repeat; String type=inst.type; if("GROUP".equals(type)){ repeat=inst.intOperand; stack.push(new Data(pos,repeat)); } else if("GROUP_END".equals(type)){ Data d=(Data)stack.peek(); repeat=d.data2; if(d.data1==repeat){ stack.pop(); }else{ d.data1++; pos=d.pos; } }else if("PRINT".equals(type)){ System.out.println(inst.strOperand); } } } public static void main(String[] args){ (new Demo()).parse(); } }