2012-12-16 4 views
1

안녕하세요 저는 JavaScript 및 HTML5 (here's the link)로 프랙탈 생성 프로그램을 작성했습니다.이 프로그램은 Complex 수학 및 프랙탈 방정식에서 수행 한 모든 연구를 포함하여 약 2 년 과정이었으며 이후 인터페이스를 업데이트하려고했습니다. 사람들이 보는 것을 상당히 위협적입니다. 코드를 살펴 보았을 때 나는 일을하는 것에 대한 나의 오래된 기법 중 일부는 매우 비효율적이었다 (예 : Complex.parseFunction).수학 표현식을 구문 분석하기위한 RegExp?

RegExp를 사용하여 함수, 연산자 및 변수와 같은 표현식의 구성 요소를 구문 분석하고 표현식에 대한 올바른 연산 순서를 구현하는 방법을 찾고 있습니다. 예는 아래 무슨 뜻인지 보여 있습니다

//the first example parses an expression with two variables and outputs to string 
console.log(Complex.parseFunction("i*-sinh(C-Z^2)", ["Z","C"], false)) 

"Complex.I.mult(Complex.neg(Complex.sinh(C.sub(Z.cPow(new Complex(2,0,2,0))))))" 

//the second example parses the same expression but outputs to function 
console.log(Complex.parseFunction("i*-sinh(C-Z^2)", ["Z","C"], true)) 

function(Z,C){ 
    return Complex.I.mult(Complex.neg(Complex.sinh(C.sub(Z.cPow(new Complex(2,0,2,0)))))); 
} 

내가 정규식이 String.prototype.replace와 모든 것을 사용하여 처리하는 방법을 알고, 내가 필요로하는 모든 정규 표현식 자체입니다. 감산 연산자 (예 : "CZ^2")와 음수 함수 (예 : "i * - (Z^2 + C)")의 차이를 알 수 있어야합니다. 변수 또는 연산자를 나타냅니다.

+2

내 권장 사항은 이런 식으로 정규식을 사용하지 않는 것입니다. 이런 식의 문제 (심지어 가능하다면)에 대한 정규 표현식은 매우 복잡해야하며 읽고 유지하기가 어렵고 다른 파싱 메서드보다 성능이 떨어질 수도 있습니다. 특정 역할을 수행하는 것으로 이미 알려진 문자열의 작은 조각을 파싱하는 데 정규 표현식을 사용할 수는 있지만 그러한 일반적이고 포괄적 인 상황에 대한 정규 표현식은 내 경험 에선 일반적으로 갈 길이 아닙니다. –

+0

전체 URL을 URI 형식으로 구문 분석하기위한 정규식을 보았습니다. 완벽하게 효율적으로 작동합니다. 이것은 크게 다르지 않습니다. 예, RegExp 자체는 작성하기 어렵지만 ** 표현을 파싱하는 데 더 효과적입니다 **. –

답변

2

정규 표현식을 표현 구문 분석기의 일부로 사용할 수는 있지만 토큰을 구분하는 것과 같이 정규식은 올바르게 중첩 된 수학적 표현식을 구문 분석 할 수있는 연산 능력이 없습니다. 이것은 본질적으로 컴퓨팅 이론의 핵심 결과 중 하나입니다 (유한 상태 오토 마트 대 푸시 다운 오토 마트). 재귀 - 하강 또는 LR 파싱과 같은 것을보고 싶을 것입니다.

한 번만 수행하면 식을 구문 분석하는 데 너무 많은 걱정을하지 않아도됩니다. 당신이하고있는 다른 모든 수학을 감안할 때, 나는 그것이 물질적 인 것인지 의심 스럽습니다.

+0

LR 구문 분석에 대해 자세히 설명 할 수 있습니까? 나는 그것에 익숙하지 않다. –

+1

http://en.wikipedia.org/wiki/LR_parser – acjay

+0

이것은 파서를 생성하는 방법 일뿐입니다. 표현식 구문에 대한 설명에서 코드를 생성 할 수있는 도구가있을 수도 있습니다. 물론 다른 많은 언어에 대한 있지만 자바 스크립트에 대한 하나의 모릅니다. 직접 작성하는 경우 재귀 적 강하로 시작하십시오. 이해하기 쉽습니다. 일반적으로이 내용은 컴파일러 또는 언어 이론에 대한 책에서 다룹니다. – DrC

관련 문제