> 백엔드 개발 > C++ > C 코드에서 사람이 읽을 수 있는 추상 구문 트리(AST)를 어떻게 얻을 수 있습니까?

C 코드에서 사람이 읽을 수 있는 추상 구문 트리(AST)를 어떻게 얻을 수 있습니까?

DDD
풀어 주다: 2024-12-18 21:46:14
원래의
674명이 탐색했습니다.

How Can I Obtain a Human-Readable Abstract Syntax Tree (AST) from C   Code?

C 코드에서 사람이 읽을 수 있는 AST 가져오기

C 소프트웨어 개발 영역에서는 사람이 읽을 수 있는 표현을 갖는 것이 도움이 될 수 있습니다. 프로그램의 추상 구문 트리(AST). AST는 프로그램 구문에 대한 구조화된 보기를 제공하므로 더 쉽게 이해하고 분석할 수 있습니다.

C 코드 구문 분석

C 코드에서 AST를 얻으려면 여러 도구를 사용할 수 있습니다. 주목할만한 옵션 중 하나는 Clang 컴파일러입니다. Clang은 사람이 읽을 수 있는 형식으로 AST를 생성할 수 있는 "-emit-llvm"이라는 기능을 제공합니다. 그러나 이 기능은 더 이상 사용되지 않으며 최신 버전의 Clang에서 제거되었습니다.

대체 도구

C 코드에서 AST를 생성할 수 있는 대체 도구는 DMS 소프트웨어 리엔지니어링입니다. 툴킷. DMS는 C 11 및 C 17을 포함한 최신 C 표준을 지원하는 포괄적인 C 파서를 제공합니다.

DMS 접근 방식

DMS를 사용하여 C 코드에서 AST를 얻으려면, 다음 단계를 따르세요.

  1. 설치 DMS.
  2. 파싱하려는 코드가 포함된 C 파일을 만듭니다.
  3. 다음 명령을 실행합니다.
run ..\DomainParser ++AST "<path_to_C++_file>"
로그인 후 복사

C 파일의 실제 경로와 함께. DMS는 AST를 생성하고 이를 사람이 읽을 수 있는 형식으로 표시합니다.

C에서 다음과 같은 간단한 Fibonacci 프로그램을 생각해 보세요.

int fib(int n) {
    if ( n == 0 || n == 1 ) 
        return n;
    int fib1 = 0; 
    int fib2 = 1;
    int fib = 0;
    for ( int i = 2; i < n; i++ ) 
    {
        fib = fib1 + fib2;
        fib1 = fib2;
        fib2 = fib;
    }
    return fib;
}
로그인 후 복사

이 프로그램에서 DMS를 실행하면 다음이 생성됩니다. AST:

(translation_unit
 (function_definition
  (function_head
   (simple_type_specifier 
    ('int')
   )
   (noptr_declarator
    (IDENTIFIER ['fib'])
    ('(')
    (parameter_declaration
     (simple_type_specifier ('int'))
     (IDENTIFIER ['n'])
    )
    (')')
    (function_qualifiers)
   )
  )
  (compound_statement
   ('{'
   (statement_seq
    (statement_seq
     (statement_seq
      (statement_seq
       (selection_statement
        ('if')
        ('(')
         (logical_or_expression
          (equality_expression
           (IDENTIFIER ['n'])
           ('==')
           (INT_LITERAL [0])
          )
          ('||')
          (equality_expression
           (IDENTIFIER ['n'])
           ('==')
           (INT_LITERAL [1])
          )
         )
        (')')
        (jump_statement
         ('return')
         (IDENTIFIER ['n'])
        )
       )
       (simple_declaration
        (simple_type_specifier $('int'))
        (init_declarator
         (IDENTIFIER ['fib1'])
         (initializer
          ('=')
          (INT_LITERAL [0])
         )
        )
       )
      )
      (simple_declaration
       (simple_type_specifier $('int'))
       (init_declarator
        (IDENTIFIER ['fib2'])
        (initializer
         ('=')
         (INT_LITERAL [1])
        )
       )
      )
     )
     (simple_declaration
      (simple_type_specifier $('int'))
      (init_declarator
       (IDENTIFIER ['fib'])
       (initializer
        ('=')
        (INT_LITERAL [0])
       )
      )
     )
    )
    (iteration_statement
     ('for')
     ('(')
      (simple_declaration
       (simple_type_specifier $('int'))
       (init_declarator
        (IDENTIFIER ['i'])
        (initializer
         ('=')
         (INT_LITERAL [2])
        )
       )
      )
      (relational_expression
       (IDENTIFIER ['i'])
       ('<')
       (IDENTIFIER ['n'])
      )
      (';'
       (postfix_expression
        (IDENTIFIER ['i'])
        ('++')
       )
      ')'
     (compound_statement
      ('{'
       (statement_seq
        (statement_seq
         (expression_statement
          (assignment_expression
           (IDENTIFIER ['fib'])
           ('=')
           (additive_expression
            (IDENTIFIER ['fib1'])
            ('+')
            (IDENTIFIER ['fib2'])
           )
          )
         )
         (expression_statement
          (assignment_expression
           (IDENTIFIER ['fib1'])
           ('=')
           (IDENTIFIER ['fib2'])
          )
         )
        )
        (expression_statement
         (assignment_expression
          (IDENTIFIER ['fib2'])
          ('=')
          (IDENTIFIER ['fib'])
         )
        )
       )
      }'))
     )
    )
    (jump_statement
     ('return')
     (IDENTIFIER ['fib'])
    )
   }'))
)
로그인 후 복사

이 AST는 프로그램의 구조와 의미에 대한 자세한 표현을 제공하므로 프로그램의 동작을 더 쉽게 이해하고 분석할 수 있습니다.

위 내용은 C 코드에서 사람이 읽을 수 있는 추상 구문 트리(AST)를 어떻게 얻을 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿