골드 분석 시스템 그것은 무엇을 할 수 있는 사용을 위해서 프로그래밍이 가능한가요?

StackOverflow https://stackoverflow.com/questions/212228

  •  03-07-2019
  •  | 
  •  

문제

I have read 금 홈페이지( http://www.devincook.com/goldparser/ )문서,자주 묻는 질문과 위키피디아를 무엇을 찾기 위해 실질적 응용이 가능하게 됩니다.나의 라인을 따라 생각을 갖는 프로그래밍 언어(쉽게)사용할 수 있는 시스템과 같은 ABAP 에 SAP 또는 X++에 차를 세우 더군다-하지만 그것은 보이지 않는 가능하게,적어도 쉽게 사용하는 경우에도 금입니다.

최종 사용의 분석 결과에 의해 생산 골드를 탈출-당신은 무엇으로 결과의 분석?

편집:실제 예(설명)은 좋은 것입니다.

도움이 되었습니까?

해결책

분석이 정말로 다음과 같은 두 단계로 이루어집니다.첫 번째가"lexing",변환 원료 문자열의 캐릭터에서는 프로그램은 더 쉽게 이해(일반적으로 토큰).

간단한 예제 lex 것으로 변환:

는 경우(a+b>2)

에서 하:

IF_TOKEN LEFT_PAREN IDENTIFIER(a) PLUS_SIGN IDENTIFIER(b) GREATER_THAN NUMBER(2) RIGHT_PAREN THEN_TOKEN

문에 걸리는 스트림,토큰의하고 시도하는 아직 더 의미가 있습니다.이 경우에,그것도 일치들을하 IF_STATEMENT.을 분석,이 경우 _STATEMENT 할 수 있을 뿐만 아니라 다음과 같다:

 IF ( BOOLEAN_EXPRESSION ) THEN 

결과의 lexing 단계는 토큰 stream,결과 분석 단계는 Parse 나무입니다.

그래서,파서를 변환할 수 있에 위하여:

    if_statement
        |
        v
    boolean_expression.operator = GREATER_THAN
       |          |
       |          v
       V       numeric_constant.string="2" 
    expression.operator = PLUS_SIGN
     |     |
     |     v
     v   identifier.string = "b"
   identifier.string = "a"

여기에서 당신은 우리가 우리가 IF_STATEMENT.는 IF_STATEMENT 가 하나는 요청에 아무 영향을 미치지 않는다 BOOLEAN_EXPRESSION.이 설명서는 어떤 방식으로 parser.면서 파서 변환하는 토큰 stream,그것은"알고있다"어떤 경우처럼 보이는,그리고 무엇을 알고 BOOLEAN_EXPRESSION 과 같이 보이는,그래서 그것을 만들 수 있는 적절한 할당을 볼 때 코드입니다.

예를 들어,당신은있는 경우:

는 경우(a+b)다음

파서 수있지 않다는 것을 알고 있는 부울 식(기 때문에+은 연산,지 boolean operator)고 분석할 수 있었 던져 오류가 이 시점에서.

다음으로,우리는 BOOLEAN_EXPRESSION3 구성 요소,사업자(GREATER_THAN),그리고 두 가지 측면,왼쪽과 오른쪽.

왼쪽에서,그것은 또 다른 표현,"a+b",는 동안 오른쪽에 포인트를 NUMERIC_CONSTANT,이 경우 문자열"2".다시,파서"알고있다"이것은 숫자이 일정하기 때문에 우리가 말한 그것에 대해 문의 숫자가 있습니다.지 않은 경우 번호를,그것은 것 식별자("a"and"b"are).

참고하는 경우 다음과 같습니다.

는 경우(a+b>"XYZ")다음

는"분석은"그냥 좋(식 왼쪽에서,일정한 문자열에 오른쪽).우리는지 알아보고에서 이 여부는 이 유효한 표현 또는하지 않습니다.우리는 알지 못하는 경우"a"or"b"참조 문자열 또는 숫자에 이점이다.그래서,이것은 무언가를 파서 수 없이 결정을 위해 미국,수 없는 플래그를 오류로,그것이 단순히 알 수 없습니다.는 것이다 발생할 때 우리는 평가(중 하나를 실행 또는 시험에서 컴파일하는 코드)IF 문입니다.

우리가 그랬다면:

는 경우[a>b)다음

파서를 쉽게 볼 수 있습니다 이 구문 오류는 문제로,그리고 오류가 발생합니다.는 문자열을 토큰의 보이지 않는 것 처럼 그것에 대해 알고 있다.

게 요점을 얻을 때 당신은 완전한 구문 분석,나무 당신이 몇 가지 보증하는 처음에는 잘라"코드 보기 좋은".지금 실행하는 동안,다른 오류가 잘 수 있습니다.

을 평가하는 분석이 나무,당신은 도보 나무입니다.당신은 코드와 연관된 주요 노드의 트리 분석 동안 컴파일하거나 평가는 부분입니다.자는 가정하에 우리는 우리가 들어 있습니다.

public void execute_if_statment(ParseTreeNode node) {
    // We already know we have a IF_STATEMENT node
    Value value = evaluate_expression(node.getBooleanExpression());
    if (value.getBooleanResult() == true) {
        // we do the "then" part of the code
    }
}

public Value evaluate_expression(ParseTreeNode node) {
    Value result = null;
    if (node.isConstant()) {
        result = evaluate_constant(node);
        return result;
    }
    if (node.isIdentifier()) {
        result = lookupIdentifier(node);
        return result;
    }
    Value leftSide = evaluate_expression(node.getLeftSide());
    Value rightSide = evaluate_expression(node.getRightSide());
    if (node.getOperator() == '+') {
        if (!leftSide.isNumber() || !rightSide.isNumber()) {
            throw new RuntimeError("Must have numbers for adding");
        }
        int l = leftSide.getIntValue();
        int r = rightSide.getIntValue();
        int sum = l + r;
        return new Value(sum);
    }
    if (node.getOperator() == '>') {
        if (leftSide.getType() != rightSide.getType()) {
            throw new RuntimeError("You can only compare values of the same type");
        }
        if (leftSide.isNumber()) {
            int l = leftSide.getIntValue();
            int r = rightSide.getIntValue();
            boolean greater = l > r;
            return new Value(greater);
        } else {
            // do string compare instead
        }
    }
}

그래서,당신은 당신이 볼 수있는 우리가 재귀적 평가기 여기입니다.당신이 볼 우리가 어떻게 확인하는 실행 시간 형식,그리고 수행하는 기본적인 검사를 받아야 한다.

무슨 일이 일어날 것입니다 execute_if_statement 을 평가합니다 그것의 주요한 표현입니다.도 우리가 원하는 만 BOOLEAN_EXPRESION 에서 구문 분석하고,모든 표현은 대부분 동일한 거리에 있습니다.그래서,execute_if_statement 전화 evaluate_expression.

우리의 시스템에서,모든 표현을 가질 연산자와 왼쪽과 오른쪽으로 나오게 됩니다.각각의 표현은 또한 표정,그래서 당신은 당신이 볼 수 있는 방법을 우리는 즉시 해보고 평가하는 이들뿐만 아니라 그들의 실제 값입니다.하나 참고가는 경우어의 일정한 다음,우리는 단순히 반환 상수 값을 경우에는 식별자,우리는 그것을 변수로(그리고 그건 좋은 장소를 던져"나는 찾을 수 없는 변수'a'"메시지),그렇지 않으면 우리는 다시는 왼쪽/오른쪽 것입니다.

나는 당신이 볼 수 있는 방법을 간단한 평가 작업할 수 있으면 토큰 스트림에서 parser.참고 어떻게 평가하는 동안,주요 요소는 언어의 장소에서,그렇지 않으면 우리가 얻은 구문 오류가고 있어 이 단계에 있습니다.우리는 단순히 기대하는"알고있다"하는 경우,예를 들어,플러스 연산자,we're going to2 식,왼쪽과 오른쪽으로 나오게 됩니다.나 때 우리는 실행하는 경우 성명,우리는 이미 부 식를 평가합니다.이 분석은 무엇을 무거운 짐입니다.

시작하는 새로운 언어 도전이 될 수 있지만,당신이 찾을 일단 당신이 회전,나머지가 매우 간단하고 그 거의"magic"는 그것의 모든 작동합니다.

참고 용서 서식하지만,밑줄이 장난하는 것--난 그것은 여전히 명확하다.

다른 팁

정보와 파서 사용에 사용할 '무료'도구를 위해 antlr.org를 권장합니다.

금은 컨텍스트가없는 문법을 입력 해야하는 모든 종류의 응용 프로그램에 사용할 수 있습니다.

동화:

기본적으로 CFG는 모든 프로그래밍 언어에 적용됩니다. 따라서 회사를위한 스크립팅 언어를 개발하려면 파서를 작성하거나 구문 분석 프로그램을 받아야합니다. 또는 회사의 비 프로그래머에 대한 입력을위한 반 자연 언어를 원한다면 구문 분석기를 사용하여 해당 입력을 읽고 더 "기계로 읽을 수있는"데이터를 뱉어 낼 수 있습니다. 기본적으로 상황이없는 문법을 사용하면 정규 표현보다 훨씬 더 많은 입력을 설명 할 수 있습니다. 금 시스템은 분명히 구문 분석 문제를 LEX/YACC (구문 분석을위한 UNIX 표준 프로그램)보다 다소 쉽게 만듭니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top