2

구문 분석 및 의미 분석이 어떻게 작동하는지 궁금합니다.구문 분석 및 의미 분석

필자는 통역사의 렉서 및 문법 구성을 마쳤습니다.

는 지금이 문법 예를 들어

에 대한 재귀 하강 (위에서 아래로) 파서를 구현하기 위하여려고하고있다, 나는 다음과 같은 문법이 : 자바 (

<declaration> ::= <data_type> <identifier> ASSIGN <value> 

그래서 내가 이런 식으로 코딩을) :

public void declaration(){ 
    data_type(); 
    identifier(); 
    if(token.equals("ASSIGN")){ 
     lexer(); //calls next token 
     value(); 
    } else { 
     error(); 
    } 
} 

나는 Int, String 및 Boolean의 세 가지 데이터 유형이 있다고 가정합니다. 각 데이터 유형의 값이 다르므로 (부울에서만 true 또는 false) 데이터 유형에 맞는지 어떻게 판별 할 수 있습니까? 내 코드의 어떤 부분이이를 결정합니까?

1.) call the semantic analysis part of my program. 
2.) store my variables into the symbol table. 

구문 분석, 의미 분석이 동시에 발생 함 : 나는에 코드를 삽입 할 경우

궁금? 또는 구문 분석을 먼저 완료 한 다음 의미 분석을 수행해야합니까?

나는 정말로 혼란 스럽다. 도와주세요.

감사합니다.

답변

1

은 구문 분석 (구문 분석)과 의미 분석 (예 : 사이의 일치 확인)을 동시에 수행합니다. 예를 들어, declaration()이 data_type()을 호출하면 후자는 선언 된 유형이 Int, String 또는 Boolean인지 여부를 나타내는 무언가를 반환 할 수 있습니다 (DT라고 함). 마찬가지로, value()는 구문 분석의 유형을 나타내는 내용 (VT)을 반환 할 수 있습니다. 그런 다음 선언()은 단순히 DT와 VT를 비교하고 일치하지 않으면 오류를 발생시킵니다. (또는 value()가 선언 된 유형을 나타내는 매개 변수를 사용할 수 있으며 이 확인을 수행 할 수 있습니다.)

그러나 두 단계를 완전히 구분하는 것이 더 쉽습니다. 이렇게하려면 구문 분석 단계에 구문 트리 (또는 추상 구문 트리)을 작성해야합니다. 따라서 최상위 레벨에서는 program()을 호출하여 전체 프로그램을 구문 분석하고 프로그램의 구문을 나타내는 트리를 반환하고 트리를 가로 지르는 semantic_analysis() 루틴으로 트리를 전달합니다. 관련 정보를 추출하고 의미 론적 제약을 강요하는 것.

0

짧은 대답은 입니다. 이것은 프로그래밍 언어의 정의에 따라 다릅니다. 그리고 하나의 파생 규칙과 세 가지 기본 유형 만 지정 했으므로 알 수있는 방법이 없습니다. 예를 들어, 프로그래밍 언어는 변수 시리얼

실제로
class Tree { 
public: 
    int foo(void) 
    { 
     return serial; 
    } 
    int serial; 
}; 

, 현대 컴파일러의 종류 모르고 을 수행 함수 선언 (foo에) 대한 유도 규칙을 처리, 아래의 코드 ++은 C처럼 앞으로 선언을 허용하는 경우 구문 분석 단계를 의미 분석 단계와 분리하십시오. 구문 분석 단계가 먼저 수행되어 입력 프로그램이 문맥 자유 문법과 일치하는지 확인합니다.또한, A bstract S yntax T ree (AST)를 생성합니다. in this SO post에서 설명한대로 AST와 구문 분석 트리의 차이점에 유의하십시오. 그런 다음 의미 분석 단계에서는 AST를 탐색하고 다른 유형과의 유형 불일치를 확인합니다.

장난감 프로그래밍 언어는 때때로 의미 론적 분석과 구문 분석을 함께 사용할 수 있다고 말합니다. 재귀 적 파생 구문 분석기를 사용하는 경우 관련 재귀 호출에 형식을 반환해야합니다.