自作言語のコンパイルを考えています。(コンパイル以前に構文解析で躓いています)
何も考えずに、先頭からソースを読み、再帰的にパースしていたのですが、goto文の扱いに困ってしまいました。(あとから構文木という言葉を知りました。たぶん構文木だと思います)。C#で構文解析をする想定です。
例えば、if(A){B}else{C}
なら、Aを必ず実行してその結果BまたはCを実行する、といった具合にパースできたのですが、goto文をパースしようと思ったときに脈絡のない場所にジャンプできてしまうためどうすればよいかわからなくなりました
if, while(for), break, continue, 四則演算, この辺りはどれもクラスで表すことができ、パースしながらオブジェクト化しています。実際の実装は、オブジェクト指向の練習を兼ねて、足し算クラス、条件分岐クラスなどなど…で実装してみました。
↓にイメージを載せます。
C#
1//基底クラス 2abstract class baseClass{ 3 public virtual returnObj Exec(); //構文を実行する 4} 5 6//複数の処理を連続して行うだけのクラス 7class Sequence: baseClass{ 8 public List<baseClass> seq; 9 public override Exec(){ 10 foreach(s in seq) s.Exec(); //順に実行する 11 } 12} 13 14//足し算をするクラス 15class Add: baseClass{ 16 public int left, right; 17 public override returnObj Exec(){ 18 return left + right; 19 } 20} 21 22//条件分岐をするクラス 23class If: baseClass{ 24 public baseClass ConditionalObj; //条件を指定 25 public baseClass trueObj; //↑がtrueのとき実行 26 public baseClass falseObj; //↑がfalseのとき実行 27 28 public override returnObj Exec(){ 29 if(ConditionalObj.Exec()){ 30 trueObj.Exec(); 31 }else{ 32 falseObj.Exec(); 33 } 34 } 35} 36 37//画面に表示するクラス 38class Print: baseClass{ 39 public returnObj printObj; 40 public override returnObj Exec(){ 41 Console.write(printObj); 42 } 43}
「goto文は処理の流れを無視する構文だ」という言葉の意味がよくわかりました。
既存のコンパイラがgoto文をどのように解析?処理?しているのかヒントを教えていただけないでしょうか。

回答2件
あなたの回答
tips
プレビュー