PKU : 2022 - Syntax Included

問題概要

http://poj.org/problem?id=2022
HTMLの文が与えられるので, これが正しい構文かどうか解析してください.

アルゴリズム

ひたすら構文解析するだけです.
がんばりました.

プログラム

bool TEXT();

int n,idx;
char s[1010];

bool URL(){
  if(strncmp(&s[idx],"http://",7)) return false;
  idx += 7;

  char buff[1010];
  for(int j=0;s[idx];j++,idx++){
    if(s[idx] == '<'){
      return false;
    }
    if(s[idx] == '>'){
      if(j >= 4 && !strncmp(&buff[j-4],".com",4)) return true;
      else return false;
    }
    buff[j] = s[idx];
  }
  return false;
}

bool LINK(){
  if(strncmp(&s[idx],"<A HREF=",8)) return false;
  idx += 8;
  if(!URL()) return false;
  if(s[idx++] != '>') return false;
  if(!TEXT()) return false;
  if(strncmp(&s[idx],"</A>",4)) return false;
  idx += 4;
  return true;
}

bool ITALICS(){
  if(strncmp(&s[idx],"<I>",3)) return false;
  idx += 3;
  if(!TEXT()) return false;
  if(strncmp(&s[idx],"</I>",4)) return false;
  idx += 4;
  return true;
}

bool BOLD(){
  if(strncmp(&s[idx],"<B>",3)) return false;
  idx += 3;
  if(!TEXT()) return false;
  if(strncmp(&s[idx],"</B>",4)) return false;
  idx += 4;
  return true;
}

bool TAG(){
  if(!strncmp(&s[idx],"<B>",3))
    return BOLD();
  else if(!strncmp(&s[idx],"<I>",3))
    return ITALICS();
  else if(!strncmp(&s[idx],"<A ",3))
    return LINK();

  return false;
}

bool TEXT(){
  while(s[idx]){
    if(s[idx] == '>') return false;
    if(s[idx] == '<'){
      if(strncmp(&s[idx],"<B>",3) && strncmp(&s[idx],"<I>",3) && strncmp(&s[idx],"<A ",3)) return true;
      bool tmp = TAG();
      if(!tmp) return false;
    }
    else{
      idx++;
    }
  }

  return true;
}

bool BODY(){
  if(strncmp(&s[idx],"<BODY>",6)) return false;
  idx += 6;
  if(!TEXT()) return false;
  if(strncmp(&s[idx],"</BODY>",7)) return false;
  idx += 7;
  return true;
}

bool HTML(){
  if(strncmp(&s[idx],"<HTML>",6)) return false;
  idx += 6;
  if(!BODY()) return false;
  if(strncmp(&s[idx],"</HTML>",7)) return false;
  idx += 7;
  return !s[idx];
}

int main(void){
  int T;

  scanf(" %d ",&T);
  while(T--){
    fgets(s,1020,stdin);
    n = strlen(s);
    s[n-1] = 0;
    idx = 0;
    printf("%sSyntax Included\n", HTML() ? "" : "No ");
  }
}