2016-10-16 6 views
0

방정식 파일을 읽고 각 규칙에 대해 AST 노드를 작성하는 문법을 만들었습니다. 내 질문은 파서가 수행 할 수있는 방정식에서 어떻게 단순화 또는 대체 할 수 있습니까? 올바르게 읽으십시오. 어떤 단계에서? AST 노드를 생성하기 전이나 후에? 따라야 할 아이디어 나 지침서를 보내주십시오.Javacc/jjtree를 사용하여 방정식/표현식을 단순화합니다.

감사합니다.

답변

1

난 당신이 적어도 하나 개의 방정식에 대한 AST을 갖는 시작 두 개의 서로 다른 문제에 대한 두 개의 서로 다른 솔루션을 요구하면 방정식 X^2+3*Y^2

처럼, 실제 값의 변수를 통해 간단한 다항식 같은입니다 있으리라 믿고있어 :

  • 의 방정식 "대체 값」및 상기 화학식에 대한 AST에 X의 == 3, Y = 2, 대체에 대해 얻어진 값, 예를 계산하고 계산 방법 3^2+3*2^2 ->21
  • 단순화하는 방법 : 대수 단순화라고 가정합니다.

이미 대용량 암호가있는 경우 값을 대체하는 첫 번째 문제는 매우 쉽습니다. (그렇지 않다면 방정식을 분석하여 먼저 AST를 생성하십시오!) 그러면 변수 이름을 포함하는 모든 리프 노드를 해당 값으로 바꾸고 AST를 수행 한 다음 현재 자식이 발생하는 모든 부모 노드에서 산술 연산을 수행하면됩니다. 숫자가되도록; 더 이상 노드를 산술적으로 평가할 수 없을 때까지 이것을 반복합니다. 기본적으로 간단한 산술을 트리 평가 체계에 연결합니다.

예를 들어 평가할 경우 트리가 단일 값으로 줄어들며 숫자 결과 My SO answer shows how do that in detail을 인쇄 할 수 있습니다. JavaCC/JJTree를 적절히 사용하여조차도 작은 프로젝트에서 이것을 쉽게 구현할 수 있습니다.

경우에 따라 수식이 더 이상 계산할 수없는 상태가됩니다 (예 : 1+x+y, x == 0 및 y에 대해 알려진 것 없음). 그러한 통합/산술 평가 프로세스의 결과는 1+y이 될 것입니다. 불행히도, 당신은 단지 AST로 이것을 가질 것입니다 ... 이제 당신은 사용자가 결과를 볼 수 있도록 결과 AST를 인쇄 할 필요가 있습니다. 이것은 더 어렵다; see my SO answer on how to prettyprint a tree. 이것은 상당히 많은 작업입니다. 수식을 통해 다항식으로 트리를 제한하면 여전히 작은 프로젝트에서이 작업을 수행 할 수 있습니다. JavaCC는 파싱에 도움을 주지만, 사전 인쇄 (prettyprinting)에 도움이되지 않습니다.

두 번째 문제는 위와 같이 변수 대체 및 산술 계산 만 수행하면 안되기 때문에 대수 법칙에 대한 지식을 인코딩하고 이러한 규칙을 복잡한 트리에 일치시키는 방법이 필요하기 때문에 훨씬 어렵습니다. 하나 또는 두 개의 대수적 법률 (예 : x+0 ->x, y-y ->0)을 고정 배선 할 수 있지만 이러한 방식으로 많은 법칙을 적용하면 상호 작용 방식이 불가능하기 때문에 혼란 스러울 수 있습니다.

JavaCC는 이러한 대답의 일부가 될 수 있지만 작은 부분 일뿐입니다. 솔루션의 나머지 부분은 충분히 어렵 기 때문에 JavaCC 위에 모든 것을 빌드하지 않고 대안을 찾는 것이 더 낫습니다. Program Transformation System (PTS)에 대한보다 체계적인 접근 방식이 필요합니다. 일반적인 PTS는 임의의 언어 (귀하의 경우 간단히 다항식)에 대한 문법을 ​​지정할 수있게하며 은 자동으로 인스턴스를 AST로 구문 분석하고 AST에서 유효한 텍스트를 다시 생성 할 수 있습니다.A 좋은 PTS는 PTS가 자동으로 인스턴스 AST를 적용 할 소스 - 소스 변환 규칙을 작성할 수있게합니다. 귀하의 경우에는 대수 법칙을 출처 - 소스 규칙으로 기록한 다음 PTS가 모든 작업을 수행합니다.

예제가 너무 길어 여기서 제공 할 수 없습니다. 그러나 here I describe how to define formulas suitable for early calculus classes, and how to define algebraic rules that simply such formulas including applying some class calculus derivative laws.

충분한 노력으로 JavaCC/JJTree 위에 자신 만의 PTS를 만들 수 있습니다. 이것은 몇 년이 걸릴 것으로 보인다. 그 모든 작업을 반복하기보다는 PTS를 얻는 것이 더 쉽습니다.