문제

간단한 표현을 처리하고 평가할 수있는 JavaScript 파서를 찾고 싶습니다. 구문 프로그램은 정기적 인 수학 표현식을 평가하고 매개 변수로 사용자 정의 기능을 지원할 수 있어야합니다. 또한 문자열 처리를 지원해야합니다. || 운영자 지원이 선호되지만 +가 트릭을 수행하더라도 괜찮습니다.

파서가 처리 해야하는 표현의 예 :

3 * (2 + 1) - 1

2 * func (2, 2)

func ( 'Hello World', 0, 5) || ' 너'

그런 것을 구현 한 사람이 있거나 어디에서 비슷한 것을 찾을 수 있습니까?

도움이 되었습니까?

해결책

수정 된 버전이 있습니다 ActionScript Parser (문자열이 아니라 문자열이 아닌 구문 분석이 아닌 AS가 아닌 AS로 작성). 그래도 문자열 지지대를 추가하기가 쉽습니다. 어딘가에 업로드하여 얻을 수 있습니다. http://silentmatt.com/parser2.js http://silentmatt.com/parser3.js.

편집하다: 나는 문자열에 대한 기본 지원을 매우 쉽게 추가했습니다. 이스케이프 시퀀스를 지원하지 않으며 TOJSFunction은 작동하지 않지만 작동하는 데 몇 분 밖에 걸리지 않았습니다. 연결 연산자를 "||"로 변경 매우 쉬워야합니다.

예제 표현을 평가하는 방법은 다음과 같습니다.

js> var parser = new Parser();
js> parser.parse("3 * (2 + 1) - 1").evaluate();
8
js> parser.parse("2 * func(2; 2)").evaluate({ func:Math.pow });
8
js> function substr(s, start, end) { return s.substring(start, end); }
js> parser.parse("func('hello world'; 0; 5) + ' you'").evaluate({ func:substr });
hello you

세미콜론을 인수 분리기로 사용한 이유를 기억하지 못합니다. 기능과 내장 "운영자"기능을 구별하는 것과 관련이 있다고 생각합니다.

다른 편집 :

나는 이것을 조금 가지고 놀았고 이제 더 나은 문자열 지원이있는 버전이 있습니다. http://silentmatt.com/parser3.js (TOJSFunction은 작동하며 표준 JavaScript Escape 시퀀스를 사용할 수 있습니다). 또한 쉼표를 사용하여 모든 기능에 대한 인수를 분리하고 || 문자열 연결 연산자 대신 +, 추가 만 추가.

다른 팁

JavaScript Parser를 의미한다고 가정합니다 안에 JavaScript, 당신은 아마도 평가 ()를 원할 것입니다.

보다: https://developer.mozilla.org/en/core_javaScript_1.5_Reference/global_functions/eval

부적절하게 사용하는 경우 Eval은 보안 위험을 나타낼 수 있습니다.

사용하지는 않았지만 빠른 Google이 공개됩니다 http://jsfromhell.com/classes/math-parser

편집하다:

당신이하고 싶은 것은 첫 번째 링크에 도달하지 못할 수도 있습니다. 또한 Douglas Crockford의 것을 살펴볼 수도 있습니다. "단순화 된 JavaScript를위한 파서"

그것은 단지 파서 일 뿐이므로 모든 평가를 직접 수행해야합니다. 그러나 다소 쉬워지고 평가를 사용하지 않습니다.

Math.js 시도 :

http://mathjs.org

예제 표현식에서와 같은 변수 및 기능의 할당 및 사용을 지원하는 광범위하고 사용하기 쉬운 파서가 제공됩니다. "기본"JavaScript와 완벽하게 통합 : Parsers 범위에서 변수와 함수를 얻고 설정할 수 있습니다.

예제 코드는 다음과 같이 평가됩니다.

var parser = math.parser();
parser.set('func', function () {
    // ... do something ...
});
parser.eval('3 * (2 + 1) - 1');
parser.eval('2 * func(2, 2)');
parser.eval('func("hello world", 0, 5) + " you"');

함수는 파서 자체 (현재 단일 라인 함수 만)에서 정의 할 수 있습니다.

parser.eval('function f(x, y) = x ^ y');
parser.eval('f(2, 3)'); // 8

임의의 파서/컴파일러를 구축하는 방법은이 자습서를 참조하십시오. (기본적으로 문법에서 재귀 하강 파서의 구성을 자동화하므로 표현 구문을 쉽게 변경할 수 있습니다). 전체 자습서는 JavaScript로 수행되므로 직접 적용됩니다.

http://www.bayfronttechnologies.com/mc_tutorial.html

자기애 스 JS의 적절한 JS 파서를 구현합니다. http://mxr.mozilla.org/mozilla/source/js/narcissus/jsparse.js. Brendan Eich (JS Creator)에 의해 작성되었습니다!

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