查找C语言中的基本语法错误,如圆括号,左括号,花括号不匹配等

Posted Steve_Abelieve

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找C语言中的基本语法错误,如圆括号,左括号,花括号不匹配等相关的知识,希望对你有一定的参考价值。

版本一:

#include <stdio.h>

#define MAXLINE 1000 /* max input line size */
char line[MAXLINE]; /*current input line*/

int getline(void);  /* taken from the KnR book. */


int
main()

  int len=0;
  int t=0;
  int brace=0, bracket=0, parenthesis=0;
  int s_quote=1, d_quote=1;


  while ((len = getline()) > 0 )
    
      t=0;
      while(t < len)
        
          if( line[t] == '[')
            
              brace++;
            
          if( line[t] == ']')
            
              brace--;
            
          if( line[t] == '(')
            
              parenthesis++;
            
          if( line[t] == ')')
            
              parenthesis--;
            
          if( line[t] == '\\'')
            
              s_quote *= -1;
            
          if( line[t] == '"')
            
              d_quote *= -1;
            
          t++;
        
    
  if(d_quote !=1)
    printf ("Mismatching double quote mark\\n");
  if(s_quote !=1)
    printf ("Mismatching single quote mark\\n");
  if(parenthesis != 0)
    printf ("Mismatching parenthesis\\n");
  if(brace != 0)
    printf ("Mismatching brace mark\\n");
  if(bracket != 0)
    printf ("Mismatching bracket mark\\n");
  if( bracket==0 && brace==0 && parenthesis==0 && s_quote == 1 && d_quote == 1)
        printf ("Syntax appears to be correct.\\n");
  return 0;



/* getline: specialized version */
int getline(void)

  int c, i;
  extern char line[];

  for ( i=0;i<MAXLINE-1 && ( c=getchar()) != EOF && c != '\\n'; ++i)
    line[i] = c;
  if(c == '\\n') 
    
      line[i] = c;
      ++i;
    
  line[i] = '\\0';
  return i;

版本二:

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

#define MAX_STACK 1024

enum

    CODE,       /* nothing of the following */
    COMMENT,    /* inside a comment */
    QUOTE1,     /* inside '' */
    QUOTE2      /* inside "" */
;

int main(void)

    int ch;
    int state = CODE;
    char stack[MAX_STACK];
    size_t top = 0; /* points to the top of the stack :-) */
    size_t line = 1;
    int error = 0;  /* for ok-message */

    while ((ch = getchar()) != EOF)
    
        if (ch == '\\n')
        
            line++;
        

        switch (state)
        
        case CODE:
            if (ch == '\\'')
            
                state = QUOTE1;
            
            else if (ch == '"')
            
                state = QUOTE2;
            
            else if (ch == '/')
            
                int second = getchar();

                if (second == '*')
                
                    state = COMMENT;
                
                else
                
                    ungetc(second, stdin);
                
            
            else if (ch == '(' || ch == '[' || ch == '')
            
                if (top < MAX_STACK)
                
                    stack[top++] = ch;
                
                else
                
                    printf("Stack too small!\\n");
                    return EXIT_FAILURE; /* exit gracefully :-) */
                
            
            else if (ch == ')' || ch == ']' || ch == '')
            
                if (top == 0) /* found closing brace but stack is empty */
                
                    printf("Line %lu: Closing '%c' found without "
                           "counterpart.\\n", (unsigned long)line, ch);
                    error = 1;
                
                else
                
                    char open = stack[--top];

                    if ((ch == ')' && open != '(') ||
                        (ch == ']' && open != '[') ||
                        (ch == '' && open != ''))
                    
                        printf("Line %lu: Closing '%c' does not match "
                             "opening '%c'.\\n", (unsigned long)line, ch, open);
                        error = 1;
                    
                
            
            break;
        case COMMENT:
            if (ch == '*')
            
                int second = getchar();

                if (second == '/')
                
                    state = CODE;
                
                else
                
                    ungetc(second, stdin);
                
            
            break;
        case QUOTE1:
            if (ch == '\\\\')
            
                (void)getchar(); /* an escaped char inside '' throw it away */
            
            else if (ch == '\\'')
            
                state = CODE;
            
            break;
        case QUOTE2:
            if (ch == '\\\\')
            
                (void)getchar(); /* an escaped char inside "" throw it away */
            
            else if (ch == '"')
            
                state = CODE;
            
            break;
        
    

    if (state == COMMENT)
    
        printf("Code ends inside comment!\\n");
    
    else if (state == QUOTE1)
    
        printf("Code ends inside single quotes!\\n");
    
    else if (state == QUOTE2)
    
        printf("Code ends inside double quotes!\\n");
    
    else if (top == 0 && error == 0)
    
        printf("Code seems to be ok.\\n");
    
    if (top > 0) /* still something in the stack */
    
        size_t i;
        for (i = 0; i < top; i++)
        
            printf("Opening '%c' found without counterpart.\\n", stack[i]);
        
    

    return 0;

以上是关于查找C语言中的基本语法错误,如圆括号,左括号,花括号不匹配等的主要内容,如果未能解决你的问题,请参考以下文章

20. 有效的括号(LeetCode)——C语言及JS实现

Sql语句的TOP用法

C语言的语法规则是啥?

编写一个测试程序,检查一个C语言程序中括号的配对情况。

c语言问题咨询 do while 大括号的使用问题

Clang-format 语法在自己的行上获取初始化程序左大括号