1



여름 프로젝트로 언어와 컴파일러를 작성하려고합니다. 구문 분석 트리 또는 BNF/EBNF를 사용하는 방법에 대한 정보를 찾는 데 어려움을 겪고 있습니다. 작성자를 프로그램하십시오. 전반적인 목표는 단순화 된 함수 언어 구문을 c로 구문 분석하는 컴파일러를 작성하는 것입니다. 나는 현재이 컴파일러를 C 언어로 작성하려고 계획하고 있지만 누군가가 더 좋은 아이디어라고 생각한다면 뭔가 다른 것을 시도해도 괜찮을 것입니다. (LEX와 같은 도구를 사용하지 않고 손으로 이것을하고 싶습니다.)

예를 들어 언어 ADD을 만들고 구문을 (+ 3 4)으로 정의하고 싶다면 EBNF를 쉽게 생성 할 수 있습니다.함수 언어 컴파일러를 만드는 방법

Program -> {Function} 
    Function -> Operator Integer Integer 
    Operator -> + 
    Integer -> Digit {Digit} 
    Digit  -> 0|1|2|3|4|5|6|7|8|9 

과는 파스 트리 만들기 위해 더 쉽게이다 : 그러나

  Function 
      | 
    ------------------- 
    |  |   | 
    Operator Integer Integer 

어떻게 것 당신 :

  1. 유효한 C 코드를 내가 아주 간단한 동작하는 예제를 볼 수 있다면 나를 올바른 방향으로 시작하는 데 충분하다고 느낄

를 얻을 수

  • 를 사용하여이 데이터를 EBNF를 대표 또는 C에 나무를 구문 분석 . 많은 분들께서 (컴파일러의 표준 리소스 인 것 같습니다) Dragon Book을 읽으라고 권하고 싶습니다. 그래서 이미 주문되어 배송 중임을 알려드립니다.

    빛에 대해 미리 알려 주셔서 감사합니다.

    용 책에서 촬영 -vikingsheepman

  • +0

    당신은 맞습니다. C는 트리를 표현하고 트리 변형을 수행하는 이상적인 언어는 아닙니다. 대수 데이터 형식 지원 및 패턴 일치를 사용하는 언어를 사용하는 것이 좋습니다. 특히 함수형 언어를 구현하는 방법은 다음과 같습니다. http://research.microsoft.com/en-us/um/people/simonpj/Papers/pj-lester-book/ –

    +0

    LL을 처리하는 "재귀 적 파서 (recursive descent parser)"를 검색하는 것이 좋습니다 1) 문법 (대부분의 언어에서는 충분했지만 예를 들어 현재의 C++이나 C#은 좀 더 복잡합니다). C에서 샘플 구현은 http://en.wikipedia.org/wiki/Recursive_descent_parser에 나와 있습니다. 다른 종류의 (일반적으로 생성 된) 파서와 비교하면 실제로 소스 코드에서 읽을 수 있습니다. –

    +0

    @jJ 코드 스 니펫이 내가 찾고있는 코드 조각이었습니다! 감사! – vikingsheepman

    답변

    1

    는 EBNF를 표현하는 방법 그룹에 노드의 유형을 열거 형을 사용하는 것입니다.

    typedef enum { StmtK , ExpK} NodeKind; 
    typedef enum { IfK, AssignK, ... } StmtKind; 
    typedef enum { OpK, ConstK} ExpKind; 
    
    typedef enum { Void, Integer } ExpType; 
    

    와 트리의 노드 이런 식으로

    typedef struct treeNode { 
        struct treeNode * child[MAXCHILDREN]; 
        struct treeNode * sibling; 
        int lineNo; 
        NodeKind nodekind; 
        union { StmtKind stmt; ExpKind exp; } kind; //Use union to save space 
        union { TokenType op; 
          int val; 
          char * name; } attr; 
        ExpType type; //To verify expression types 
    } TreeNode; 
    

    이 C 코드를 생성 할 길이 멀다는 아직이지만, 본질적으로 생성 된 트리를 통해 몇 가지 검사를 할 필요를 정의 : 예를 들어, (구문, 의미 ...) 코드를 생성합니다. 이를 수행하는 방법은 빌드중인 컴파일러 유형 (하나 이상의 패스)에 따라 다릅니다. 드래곤 북 (Dragon Book)을 주문했다면, 거기에서이 모든 것을 발견 할 것입니다.

    +0

    굉장히 빠른 답장을 보내 주셔서 감사합니다! – vikingsheepman

    +0

    그래서이 글을 내 포스트에서 제안한'ADD' 언어에 대해 정확히 이해한다면, 열거자를 사용하여 게시 한 것처럼 나무를 만들 것입니다. typedef enum {ExpK} NodeKind; (언어는 표현식 만 사용합니다.) typedef enum {OpK} ExpKind;'('+'연산자의 경우)와'typedef enum {Integer} ExpType;'(가능한 표현식 반환)은? 또는 나는 여기에서 기초로부터 떨어져서 길이다? – vikingsheepman

    +0

    @vikingsheepman 예, 맞습니다. – Evans