문제

내가 찾는 토큰화하 Java/Javascript 같은 표현에서 Javascript 코드입니다.내가 입력될 문자열을 포함하는 표현,그리고 출력해야 한 배열의습니다.

어떻게 하는 것이 가장 좋은 일을 위해 무언가가 이것을 좋아하는가?이 필요한가요를 반복하는 문자열이나 있는가 정기적인 표현하는 것이 자동으로 이 작업을 수행합니까?

내가 필요할 수 있도록 이것을 지원하기:

  • 숫자와 문자열(단일 및 이중 인용,견적서 탈출)
  • 기본적인 수학과 boolean 사업자와 비교기(+, -, *, /, !, 그리고,아 <,>,etc.)
  • 점 브라켓 표기에 대한 개체에 액세스과 재귀(foo.바 foo['bar'],foo[2][prop])
  • 괄호와 중첩
  • 원자(foo?바'baz')
  • 함수 호출(foo(bar))

저는 특별히 피하고 싶은 사용 eval() 나무의 종류를 위한 보안상의 이유입니다.이 eval() 지 않을 토큰에 대한 표현이다.

도움이 되었습니까?

해결책

를 작성하는 학습을 재귀-강 parser.면 개념을 이해하는,당신은 그것을 할 수 있는 모든 언어:Java,C++,JavaScript,SystemVerilog,...whatever.할 수 있는 경우 문자열 처리할 수 있습니다 다음은 분석합니다.

재귀 출신 분석은 기본적인 기법에 대한 분석을 쉽게 할 수 있는 코드입니다.이는 경우에 유용합니다 액세스하지 않는(나고 싶지 않아 바보로)파서 생성기입니다.

에서 재귀 출신 파서,모든 규칙에서의 문법은 번역하는 절차를 분석하 규칙이 있습니다.필요할 경우를 참조하는 다른 규칙이 이렇게 호출하여 그들-그들은 단지 절차가 있습니다.

간단한 예제:식 포함하는 번호,또한기와 곱(이 설명의 연산자 우선 순위).먼저,문법:

expr ::= term
         | expr "+" term

term ::= factor
         | term "*" factor

factor ::= /[0-9/+ (I'm using a regexp here)

지금 쓰는 파서(을 포함하는 렉;과 재귀 하강을 던질 수 있습니다 두 가지를 함께).나는 결코 사용되는 자바스크립트,그래서 이것을 시도서(내가 녹슨)Java:

class Parser {
  string str;
  int idx; // index into string

  Node parseExpr() throws ParseException
  {
    Node op1 = parseTerm();
    Node op2;

    while (idx < str.size() && str.charAt(idx) == '+') {
      idx++;
      op2 = parseTerm();
      op1 = new AddNode(op1, op2);
    }
    return op1;
  }

  Node parseTerm() throws ParseException
  {
    Node op1 = parseFactor();
    Node op2;

    while (idx < str.size() && str.charAt(idx) == '*') {
      idx++;
      op2 = parseFactor();
      op1 = new MultNode(op1, op2);
    }
    return op1;
  }

  Node parseFactor() throws ParseException
  {
    StringBuffer sb = new StringBuffer();
    int old_idx = idx;

    while (idx < str.size() && str.charAt(idx) >= '0' && str.charAt(idx) <= '9') {
      sb.append(str.charAt(idx));
      idx++;
    }
    if (idx == old_idx) {
      throw new ParseException();
    }
    return new NumberNode(sb.toString());
  }
}

당신이 볼 수 있는 방법을 각각의 문법 규칙으로 변환하는 절차이다.I 테스트하지 않았습니다 이;는 운동에 대한 독자입니다.

당신은 또한 걱정할 필요가 오류에 대한 탐지가 있습니다.실제 컴파일러를 복구해야에서 분석 오류를 시도하는 분석의 나머지에 그것의 입력이 있습니다.한-라인 표현을 파서 다음과 같이 하나하지 않을 시도해야합 복구에서 모든지만,그것은 필요지 않을 결정하는 구문 분석 오류가 존재하는 플래그습니다.가장 쉬운 방법은 당신의 언어로 그것은 예외를 발생시,그리고 그것을 잡아에 진입 점 parser.내가 감지되지 않았 가능한 모든 분석에서 오류가 발생하는 예상입니다.

에 대한 더 많은 정보 보"LL 파서"그리고"Recursive 출신 파서에서"Wikipedia.내가 말했듯이 시작 부분에서,당신이 할 수있는 경우 개념을 이해하는(그리고 그들은 간단한 비교하는 개념 LALR(1)상태 시스템 구성을 폐쇄)다음은 능력을 파서를 작성을 위한 작은 작업에서 어떤 언어는 한,당신은 몇 가지 기초적인 문자열 기능입니다.을 즐길 수 있는 힘입니다.

다른 팁

속도가 중요하지 않은 간단한 Lexers의 경우, 나는 일반적으로 각 종류의 토큰에 대한 정규식을 작성하고 입력 시작과 함께 각각 각각을 반복적으로 일치 시키려고 시도합니다. (O (n^2) 알고리즘으로 감지하지 않도록하십시오!) Lex와 같은 도구는 Regexes를 하나의 상태 머신으로 결합하기 때문에보다 효율적인 Lexer를 산출합니다.

어휘 분석기를 구현해야합니다. 당신이 사용할 수있는 JS/CC 그렇게하거나 자신의 유한 자동 자마를 구현할 수 있습니다.

공식적으로 조작 할 언어는 규칙적이므로 정규 표현식을 사용할 수 있습니다. 그러나 나는 당신에게 그것을 추천하지 않았습니다.

althougth 나는 JS/CC를 사용한 적이 없다. 나는 그것을 먼저 시도 할 것이며, 그것이 작동하지 않으면 혼자서 어휘 분석기를 만들려고 노력할 것이다.

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