Antlr에서 토큰의 정확한 발생 수를 지정하는 방법은 무엇입니까?
-
08-07-2019 - |
문제
아래에 표시된 것과 같은 파일의 문법을 정의해야합니다.
// 샘플 파일
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에게 언어를 구문 분석하라고 말할 수 없습니다.
제휴하지 않습니다 StackOverflow