2014-12-03 7 views
2

나는 다음과 같은 문법을 짓고 있어요 : 나는 "CDIJK을"CD923 "을 소비해야하지 때문에 성공적으로 문자열"CD923IJK "을 구문 분석하지 ANTLR의 근거를-LL (*) 구문 분석 메커니즘

Letter  : 'a'..'z'|'A'..'Z'  ; 

Number  : '0'..'9'  ; 

Float 
    : Number+ '.' Number+ 
    ; 

a5 
@init 
{ 
int n = 1; 
} 
: ({n<=5}?=>(Letter|Number){n++;})+ 
; 

내가

물론 고급 분석을 필요로

을 원하는 것처럼이 문법은 LL (K)이 있기 때문에, "CD923"을 FLOAT이 문제가 사라 주석되어 사용되는 경우

일어나고처럼 "나는 내다 깊이

을 설정하고있어
options 
{ 
k=5; 
} 

하지만 아무 것도 해결되지 않았습니다. 어떤 생각? 제안 500 - Internal Server Error

UPDATE

응답 나는 다음과 같은 규칙

내가 CD923은 영숫자와 1.23 부동이다 CD9231.23 일치 할 필요
public test :a5 Float ; 

을 추가했다. 난 당신이 간단한 해결책을 만들 수 어쩌면 생각 enter image description here

+1

실제 문법과 입력입니까? 그것은 당신이 점이 없기 때문에'Float' 규칙이 어떤 입력과도 매치 할 수있는 방법을 보지 못합니다. –

+0

@ 500-InternalServerError 이것은 내 문법의 단편입니다. 문제는 이것이 일어난 이유입니다. 체인을 따르는 3 개의 글자에서 "123"을 건너 뛰고 소비하는 이유는 무엇입니까? – Cyberguille

+0

제 제안은 실패한 입력 내용과 함께 여기에 올릴 수있는 문법을 줄이는 것입니다. –

답변

1

문제는 Number와 Float 규칙에있는 것 같습니다. 이 두 규칙에서 모호성이 있지만 Number와 Float가 모두 렉서 규칙이므로 모든 토큰을 처리하기 위해 antlr 암시 적으로 nextToken 규칙을 작성해야합니다.

nextToken: Letter | Number | Float; 

ANTLR (이 점프를 지배하지만,이 경우 그 적절한 규칙 인 결정할 수 없습니다 찾을 수 그가 DFA를 통해 도보 자리를 찾을 때 나 : 예에서 nextToken은 다음과 같다 플로트)로 이동합니다. Float 규칙을 파서 규칙으로 만드는이 동작을 피할 수 있습니다. 다음과 같이 시도해보십시오.

grammar a5; 

s : a5 coordinate? 
    ; 

a5 
@init{ 
int n = 0; 
} 
: ({n<5}?=> (LETTER|Number){n++;})+ 
; 


Number : '0'..'9' 
    ; 

coordinate : Number+ '.' Number+ 
    ; 

LETTER 
    : 'a'..'z'|'A'..'Z' 
    ; 
1

: 당신이 당신의 A5 규칙의 항목은 항상 크기 5의 텍스트가 될 것이다 이하 해당에 따라 규칙을 작성할 수 있다는 것을 알고있는 경우 :

그러나 구문 분석 트리를 참조
A5 
: (Letter|Number)(Letter|Number)(Letter|Number)(Letter|Number)(Letter|Number) 
    | (Letter|Number)(Letter|Number)(Letter|Number)(Letter|Number) 
    | (Letter|Number)(Letter|Number)(Letter|Number) 
    | (Letter|Number)(Letter|Number) 
    | (Letter|Number) 
; 

다른 해결책은 의미 상에 확인 후 계정에있는 lenthg을 복용하고,없이 규칙을 만들 수 ...

AK 
    : (Letter|Number)+ 
; 

이, 희망이 몇 가지 아이디어를하는 데 도움이된다