2012-08-10 1 views
1

저는 ANTLR을 처음 접했고 ANTLRWorks1.4.3에서 문법을 따르려고합니다.더 긴 토큰 내에서 토큰을 일치시키려는 ANTLR

command 
: 'go' SPACE+ 'to' SPACE+ destination 
; 

destination 
: (UPPER | LOWER) (UPPER | LOWER | DIGIT)* 
; 

SPACE 
: ' ' 
; 

UPPER 
: 'A'..'Z' 
; 

LOWER 
: 'a'..'z' 
; 

DIGIT 
: '0'..'9' 
; 

'대상'에 '이동'및 '끝'키워드의 처음 두 문자가 포함 된 경우를 제외하고는 정상적으로 작동하는 것 같습니다. 나는 다음 명령을 주면 예를 들어 는 다음과 같이

go to Glasgo 

노드 트리가 표시됩니다 내가 기대했다

enter image description here

이 대상으로 단어를 채우기에 맞게.

'go'대신 'travel'과 같이 키워드를 변경해 보았습니다. 이 경우 목적지에 'tr'이 있으면 ANTLR이 불평합니다.

왜 이런 일이 발생하는지 알고 싶습니다. 그리고 이것을 고치는 방법? 사전에

감사합니다.

답변

1

ANTLR 렉서와 구문 분석기는 엄격하게 구분됩니다. 당신의 입력은 먼저 토큰 화되고, 그 후에 파서 규칙이 상기 토큰상에서 동작한다.

는 경우, 입력 go to Glasgo 다음 X 토큰에 토큰 화 :

  1. 'go'
  2. ' ' (SPACE)
  3. 'to'
  4. 'G' (UPPER)
  5. 'l' (LOWER)
  6. 'a' (LOWER)
  7. 's' (LOWER)는 "매달려"'go' 키워드 잎
  8. 'go'

. 이것은 단순히 ANTLR의 렉서가 작동하는 방식입니다. 사용자는이를 변경할 수 없습니다. 당신이 경우

enter image description here


:

command 
: 'go' 'to' DESTINATION 
; 

DESTINATION 
: (UPPER | LOWER) (UPPER | LOWER | DIGIT)* 
; 

SPACE 
: ' ' {skip();} 
; 

fragment UPPER 
: 'A'..'Z' 
; 

fragment LOWER 
: 'a'..'z' 
; 

fragment DIGIT 
: '0'..'9' 
; 

이 결과 :

귀하의 경우 가능한 솔루션은 destination 대신 파서 규칙의 렉서 규칙을 만들 것 둘의 차이점이 무엇인지 모를 경우, Practical difference between parser rules and lexer rules in ANTLR?

,515,

fragment 대한 S : What does "fragment" mean in ANTLR?


PS. Glasgo w?

+0

감사합니다. 지금은 훨씬 명확 해. ** 규칙이 렉서 (lexer)가 만든 토큰들로만 구성된 경우 렉서 규칙을 작성하십시오. ** 올바른 진술입니까? –

+0

@Atul, 아니, 꼭 그런 것은 아닙니다 (파서 규칙이 없을 경우 ...). 예를 들어,'command'도 토큰들로만 이루어 지지만 파서 규칙을 유지해야합니다. 렉서 규칙을 당신의 언어의 원자라고 생각하십시오. "대상"은 단 하나의 이름이므로 렉서 규칙이어야합니다. 그러나 "명령"은 여러 다른 (렉서) 규칙으로 구성되며 구문 분석 규칙이어야합니다. –

+0

알았어, 됐어! 다시 한번 감사드립니다. –