2012-06-20 2 views
1

질문이 있습니다. 지금 약 1 시간 동안 검색 중입니다. 주어진 ANTLR- 렉서 룰은 2 개 (또는 그 이상)의 서브 룰로 구성된다. Lexer는 이제 별도의 AST 노드를 생성합니다.ANTLR : 토큰 조합

예 : [...]$a[...]의 주어진 입력으로

[...] 
variable: '$' CamelCaseIdentifier; 
CamelCaseIdentifier: ('a'..'z') Identifier*; 
Identifier: ('a'..'z' | 'A' .. 'Z' | '0'..'9')+; 
[...] 

결과는 이러한 규칙은 분리 할 수없는 것을, 나는 렉서를 알 수있는 방법을 찾고 있어요 ..., $, a, ...

입니다 : ..., $a, ...

아무도 도와 줄 수 있습니까?

답변

1

파서 규칙은 대문자와 소문자와 렉서 규칙을 시작 예와 함께. 당신은 출력 할 AST로, 파서 규칙의 각 토큰은 별도의 노드가 될 것이다, 그래서 당신은 대신 파서 규칙의 렉서 규칙 variable 규칙을 만들고 싶어합니다 때 :

Variable   : '$' CamelCaseIdentifier; 
CamelCaseIdentifier : ('a'..'z') Identifier*; 
Identifier   : ('a'..'z' | 'A' .. 'Z' | '0'..'9')+; 

그러나 당신이 할 경우 이렇게하면 입력 123456Identifier으로 토큰 화됩니다. 이는 아마도 원하는 것이 아닙니다. 게다가 Identifier 규칙은 AlphaNum이라는 이름이 좋습니다. 그리고 조각 규칙을 만들면 렉서가 임의의 AlphaNum 토큰을 생성하지 않지만 다른 렉서 규칙 (예 : CamelCaseIdentifier 규칙)에만 AlphaNum을 사용하게됩니다. 당신은 또한 Identifier 일치하는 규칙을 원하는 경우 같은 것을 할 :

Variable   : '$' (CamelCaseIdentifier | Identifier); 
CamelCaseIdentifier : 'a'..'z' AlphaNum*; 
Identifier   : 'A'..'Z' AlphaNum*; 

// a fragment rule can't be used inside parser rules, only in lexer rules 
fragment AlphaNum : 'a'..'z' | 'A' .. 'Z' | '0'..'9'; 
0

아마도 모든 규칙 이름을 대문자로 변환하려고합니까?

편집 :

grammar Dummy; 

prog : VARIABLE*; 

VARIABLE: '$' CAMELCASEIDENTIFIER; 
CAMELCASEIDENTIFIER: ('a'..'z') IDENTIFIER*; 
IDENTIFIER: ('a'..'z' | 'A' .. 'Z' | '0'..'9')+; 


WS: (' ' | '\t' | '\n' | '\r' | '\f')+ {$channel = HIDDEN; }; 
0

을 내가 컴파일러와 ANTLR에서 초보자,하지만 내 제한된 이해에서하는 대문자 (렉서) 규칙이 정규 표현식만을위한 것입니다 . 소문자 (파서) 규칙은 렉서 규칙으로도 두 배가 될 수 있습니다 ([1] 참조). 변수가 대문자인지 소문자인지는 중요하지 않습니다. 맞습니까?

어쨌든, 제가 틀릴 수도 있지만, 그냥이 할 간단하지 않을 것이다 :

[...] 
variable: '$' ('a'..'z' | 'A' .. 'Z') ALPHANUM*; 
ALPHANUM: ('a'..'z' | 'A' .. 'Z' | '0'..'9'); 
[...] 

를?

당신이 재사용 계획이라면 ('A'.. 'Z를'| 'A'.. 'Z')을, 당신은 수행해야합니다

[...] 
variable: '$' ALPHA ALPHANUM*; 
fragment ALPHA: ('a'..'z' | 'A' .. 'Z') 
ALPHANUM: (ALPHA | '0'..'9'); 
[...] 

사과를이 완전히 꺼베이스 인 경우, 나는 여전히 배우고 있습니다.

[1] https://theantlrguy.atlassian.net/wiki/spaces/ANTLR3/pages/2687210/Quick+Starter+on+Parser+Grammars+-+No+Past+Experience+Required