用递归解析 - 括号

时间:2014-12-16 17:09:58

标签: c parsing recursion brackets

有些人可以给我一个暗示这个问题: 只有当表达式包含正确关闭的括号和括号且没有其他字符(甚至是空格)时,表达式才是正确的。例如,()({}()({}))是正确的表达式,而({)}不是正确的表达式或{}({}))。空表达式(不包含任何字符)是正确的。 给定字符串表达式确定表达式是否正确以及是否确定最大嵌套级别。嵌套括号的最大级别是彼此的最大数量。

实例 {}({}){{(({}))}} 回答:5

{}({})) - 1(因为表达式不正确)

这就是我到目前为止所做的。

#include <stdio.h>
#include <stdlib.h>

FILE *fi, *fo;
int first, er;

void X();
void Y();

void S() {
    X();
    Y();
}
void X() {
    if(first=='{') {
        first=fgetc(fi);
        X();
        if(first=='}')
            first=fgetc(fi);
        else
            er=1;
        S();
    }
}
void Y() {
    if(first=='(') {
        first=fgetc(fi);
        Y();
        if(first==')')
            first=fgetc(fi);
        else
            er=1;
        S();
    }
}
int main()
{
    fi = fopen("brackets.in","r");
    fo = fopen("brackets.out","w");
    first=fgetc(fi);
    S();
    if(first!='\n')
        er=-1;
    fprintf(fo,"%d",er);
    fclose(fi);
    fclose(fo);
    return 0;
}

1 个答案:

答案 0 :(得分:2)

首先,它有助于将您的问题视为正式语法。

S = The Language you are testing for

S->
  NUL    // Empty   
  SS     // S followed by itself.   
  [ S ]  // Case 1   
  ( S )  // Case 2   
  { S }  // Case 3

由于此语法只有一个符号(S),因此只需要一种解析方法。

以下代码不完整,但希望它可以解决这个问题。

char curr_char;

int main (void)
{
  curr_char = getc();
  result = parse_s();
  return 0;
}

// Parse the S pattern off input.  When this method completes, curr_char points to the character AFTER S.
// Returns recursion count or -1 on fail.
int parse_s()
{
  max_count = 0;
  while(true)
  {
    int curr_count = 0;
    switch 'curr_char':
    {
      case '[': // [
        int count = parse_s(); // S
        if (count == -1) return -1;  // The S must be valid
        if (curr_char != ']') return -1;  // ]
        curr_char = getc();  // Advance past the ]
        curr_count = count + 1;  // This expression is 1 nest greater than its contained S
      break;

      case '(':
        // XXX
      break;

      case '{':
        // XXX
      break;

      default:
        // This is either the SS (find the max of the two), the NUL case (return 0), or an error (return -1)
      break;
    }
    // In the SS case you're gonna have to loop and do something here.
  }
  return max_count;
}