문제

아래에 표시된 것과 같은 파일의 문법을 정의해야합니다.

// 샘플 파일
namecount = 4
이름 = a
이름 = b
이름 = c
이름 = d
// 파일 끝

이제 토큰을 정의 할 수 있습니다 namecount 그리고 이름. 그러나 유효한 토큰 인스턴스 수를 포함하여 파일 구조를 정의해야합니다. 이름 , 그것은 다음 가치입니다 namecount. 나는 값을 구문 분석하고 정수로 변환하고 문법의 글로벌 범위에서 변수에 저장되었습니다 (변수로 예 : 변수 체크 안함).

문법을 정의하는 방법 이름 정확히 반복해야합니다 체크 안함 타임스?

도움이 되었습니까?

해결책

이것은 문법 자체에서 표현할 수 없습니다. 숫자가 수정되면 예상 토큰의 수를 표현할 수 있습니다. 그러나 토큰 스트림은 값에 따라 변경됩니다. 당신이 할 수있는 것은 이것을 Lexer/Parser 조합에 포함시키는 것입니다. 그러나 일반 문법 구문만으로는이 구조를 만들 수 없습니다. 당신은 아마도 줄을 따라 무언가를 원할 것입니다

grammar test;

@members {
  private int count = 0;
  private int names = 0;
}

file
    : count (name)+
      {
        if (count != names) throw new Exception("");
      }
    ;

count
    : 'NameCount' EQ Number
      {
        count = Integer.parseInt($Number.text);
      }
    ;

name
    : 'Name' EQ Value
      {
        names++;
      }
...

다른 팁

이것이 컨텍스트가없는 문법인지 확실하지 않습니다. 그렇지 않다면, 당신은 antlr에게 언어를 구문 분석하라고 말할 수 없습니다.

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