Lexer가 특정 규칙 중에 만 토큰과 일치 할 수 있도록 Antlr에 메커니즘이 있습니까?

StackOverflow https://stackoverflow.com/questions/1620011

  •  06-07-2019
  •  | 
  •  

문제

내 언어에 키워드를 추가하고 싶습니다.

이 키워드는 하나의 특정 파서 문법 규칙 중에 만 일치해야합니다.

뒤로 호환성으로 인해이 키워드가 변수 이름으로 계속 사용하도록 허용하고 싶습니다. 즉, 토큰이 변수 이름에 적합한지를 결정하는 Lexer 규칙과 일치 할 수 있습니다.

Lexer는 파일에서 발견 될 때마다 새로운 규칙과 일치합니다.

var_declaration 규칙을 수정하여 ID 또는 새로운 키워드 토큰과 일치하도록하기 위해이 문제를 해결하는 적절한 방법입니까?

protected
modified_var_declaration:
     VAR (IDENT|KEYWORD);
;

관련 규칙은 다음과 같습니다.

IDENT   // matches variable names
options { testLiterals=true; }
    : ( '_' | 'a'..'z' | 'A'..'Z' ) ( '_' | 'a'..'z' | 'A'..'Z' | DIGIT )*
;

KEYWORD: // my new keyword
  "key"
;

변수 생성을위한 파서 규칙은 다음과 같습니다.

protected
var_declaration:
     VAR IDENT;
;
도움이 되었습니까?

해결책

많은 언어에는 상황에 맞는 키워드가 있습니다. 그들을 처리하는 첫 번째 단계는 새 파서 규칙을 추가하는 것입니다. ident 변수 이름을 나타냅니다. 이 규칙을 구문자 대신에 사용하십시오 IDENT.

ident
    : IDENT
    | KEYWORD
    ;

다른 팁

체크 아웃 http://www.antlr.org/wiki/display/antlr3/1.+ lexer 도움이 될 것입니다. "키워드"가 허용 될 때 깃발을 설정하고 설정해야합니다.

KEYWORD : { keywordcontext }?=> "key";

여기서 트릭은 키워드를 기대할 수있는 곳으로 토글링하는 것입니다. 이는 사소한 것보다 적을 수 있습니다.

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