したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |
レス数が1スレッドの最大レス数(1000件)を超えています。残念ながら投稿することができません。

ヒッキープログラミングスレ

482(-_-)さん:2013/06/09(日) 14:49:33 ID:???
昨夜気づいた問題を修正した版

function hoge(str, p, list){
 var i, c, s, newlist, t = 0, e = 0;
 /** t
  *  0 一つ目の要素の読み取り開始前段階
  *  1 一つ目の要素はシンボルで読み取り中
  *  2 一つ目の要素はリスト
  *  3 一つ目の要素を登録完了
  *  4 一つ目の要素と二つ目の要素を繋ぐ'.'読み取り前段階
  *  5 二つ目の要素の読み取り開始前段階
  *  6 二つ目の要素はシンボルで読み取り中
  *  7 二つ目の要素はリスト
  **/
 for (i = p; i < str.length; i++) {
  c = str.charAt(i);
  if (c == '(') {
   if (t == 0) { //一つ目の要素はリスト
    newlist = new Array(); i = hoge(str, i + 1, newlist); t = 2;
   } else if (t == 3) { // . の省略、二つ目の要素はリスト(そのリストの一つ目の要素がリスト)
    newlist = new Array(); i = hoge(str, i, newlist) - 1; t = 7;
   } else if (t == 5) { //二つ目の要素はリスト
    newlist = new Array(); i = hoge(str, i + 1, newlist); t = 7;
   } else {
    alert("error char '(' t=" + t); return str.length + 10;
   }
  
  } else if (c == ')') {
   if (t == 1) { //要素が一つしかない(要素はシンボル)
    list[0] = s; list[1] = "nil";
   } else if (t == 2) { //要素が一つしかない(要素はリスト)
    list[0] = newlist; list[1] = "nil";
   } else if (t == 6) { //二つ目の要素(シンボル)の登録
    list[1] = s;
   } else if (t == 7) { //二つ目の要素(リスト)の登録
    list[1] = newlist;
   } else if (t != 0) { // t==0 は空のリストになる
    alert("error char ')' t=" + t); return str.length + 10;
   }
   return i;
  } else if (c == ' ') {
   if (p == 0) { //一番外側の括弧である必要があり構文エラー
    alert("error char ' ' t=" + t + " (p == 0)"); return -1;
   }
   if (t == 1) { //一つ目の要素
    list[0] = s; t = 3;
   } else if (t == 2) { //一つ目の要素はリスト
    list[0] = newlist; t = 3;
   } else if (t == 4) { //次にくるのは2つ目の要素
    t = 5;
   } else {
    alert("error char ' ' t=" + t); return str.length + 10;
   }
   
  } else if (c == '.') {
   if (t == 3) { //このリストは略式でない
    t = 4;
   } else {
    alert("error char '.' t=" + t); return str.length + 10;
   }
  } else {
   if (t == 0) { //一つ目の要素のシンボル開始
    s = c; t = 1;
   } else if ((t == 1) || (t == 6)) { //シンボル文字が続く
    s += c;
   } else if (t == 3) { // . が省略されてるので二つ目の要素はリスト(そのリストの一つ目の要素がシンボル)
    newlist = new Array(); i = hoge(str, i, newlist) - 1; t = 7;
   } else if (t == 5) { //二つ目の要素のシンボル開始
    s = c; t = 6;
   } else {
    alert("error char '"+c+"' t=" + t); return str.length + 10;
   }
  }
 }
 if (p != 0) { //再帰呼び出しで文字列を読み取り終わってしまっている
  return -1;
 }
 if (i > str.length + 1) {
  return -1;
 }
 if (t == 1) {
  list[0] = s;
 } else if (t == 2) {
  list[0] = newlist;
 } else {
  return -1;
 }
 return i;
}




掲示板管理者へ連絡 無料レンタル掲示板