문제

에서 구문 분석 키트:개별 인용 문자를 일치시키는 방법은 무엇입니까?

파서를 정의하는 경우:

@start = int;
int = /[+-]?[0-9]+/

불행히도 다음을 포함하지 않는 한 "+" 접두사가 붙은 정수는 구문 분석되지 않습니다.

@numberState = "+" // at the top.

위의 숫자 구문 분석에서 "Symbol" 기본 구문 분석기는 언급조차 되지 않았지만 여전히 활성 상태이며 사용자 정의 구문 분석기를 재정의합니다.

좋습니다. 숫자의 경우 지시문을 추가하여 문제를 해결할 수 있습니다."++"에 대한 파서를 생성하려는 경우 어떻게 됩니까?다음 파서가 작동하도록 할 수 있는 지시문을 찾지 못했습니다.

@start = plusplus;
plusplus = "++";

사용자 파서에 대한 기본 파서의 영향은 매우 임의적인 것처럼 보입니다."++"를 구문 분석할 수 없는 이유는 무엇입니까?

기본 파서를 완전히 끌 수 있습니까?제가 일반적인 일을 하지 않으면 방해가 되는 것 같아요.

아니면 제가 다 잘못 알고 있는 것일 수도 있습니다.

편집하다:

플러스 플러스를 구문 분석하는 파서를 찾았습니다.

@start = plusplus;
plusplus = plus plus;
plus = "+";

나는 대답이 다음과 같다고 생각합니다.파서에 정의된 리터럴 기호는 기본 파서 간에 겹칠 수 없습니다.적어도 한 번은 완전히 포함되어야 합니다.

도움이 되었습니까?

해결책

개발자 ParseKit 여기.

몇 가지 답변이 있습니다.

  1. 더 많이 배울수록 ParseKit API가 매우 우아하고 합리적이라는 것을 알게 될 것입니다.내가 그렇게 말함으로써 내 경적을 터뜨리는 것이 아니라는 점을 명심하십시오.ParseKit을 만들었지만 ParseKit API를 디자인하지는 않았습니다.오히려 ParseKit의 디자인은 거의 전적으로 ParseKit의 디자인에 기반을 두고 있습니다. 스티븐 메츠커의 Java로 파서 구축.ParseKit을 깊이 이해하고 싶다면 책을 확인해 보시기 바랍니다.게다가 이 책은 일반적인 구문 분석에 관한 환상적인 책입니다.

  2. 혼란스러워요 토크나이저 상태 ~와 함께 파서.두 가지 별개의 사항이지만 자세한 내용은 여기서 답변할 수 있는 것보다 더 복잡합니다.다시 한 번 Metsker의 책을 추천합니다.

  3. 귀하의 질문에 답변하는 과정에서 ParseKit에서 작은 버그를 발견했습니다.감사해요!그러나 원하는 결과를 얻기 위해 올바른 문법을 사용하지 않았기 때문에 위에서 설명한 결과에는 영향을 미치지 않았습니다.다음에서 소스 코드를 업데이트해야 합니다. 구글 코드 프로젝트 지금 그렇지 않으면 아래의 내 조언이 당신에게 효과가 없을 것입니다.


이제 귀하의 질문에 답변해 드리겠습니다.

나는 당신이 둘 다 인식하는 문법을 찾고 있다고 생각합니다. ++ 단일 다중 문자로 Symbol 토큰은 앞에 붙은 숫자도 인식합니다. + 문자가 아닌 명시적으로 양수인 문자 + Symbol 토큰 다음에 Number 토큰.

당신이 찾고 있는 올바른 문법은 다음과 같습니다.

@symbols = '++';    // declare ++ as a multi-char symbol
@numberState = '+'; // allow explicitly-positive numbers
@start = (Number|Symbol)*;

다음과 같이 입력하세요.

++ +1 -2 + 3 ++

다음과 같이 토큰화됩니다.

[++, +1, -2, +, 3, ++]++/+1/-2/+/3/++^

두 가지 알림:

  1. 다시 한번 말하지만, 이 작업이 올바르게 작동하는지 확인하려면 지금 소스 코드를 업데이트해야 합니다.이 경우 버그를 수정해야 했습니다.
  2. 이 내용은 까다롭기 때문에 ParseKit의 작동 방식을 완전히 이해하려면 Metsker의 책을 읽는 것이 좋습니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top