2014-01-28 3 views
0

내 문법은 다음과 같습니다 : 나는 (GRUN을 통해) 그것을 다음과 같은 입력 데이터를 공급하기 위해 노력하고있어내 ANTLR 문법이 어떻게 일치하지 않습니까?

grammar BirdGrammar; 


lines: (init '\n')*; 
init : lineCode 
     | continuation; 

sep : ' ' 
    | '-' 
    ; 


lineCode : interfaceList 
      | protocolList 
      | interfaceAddress 
      | interfaceFlags 
      ; 

interfaceList  : '1001' sep INTERFACENAME ' ' interfaceStatus ' (index=' index ')'; 
protocolList  : '1002'; 
interfaceAddress : '1003'; 
interfaceFlags : '1004'; 
continuation  : ' '; 

interfaceStatus : 'up' 
        | 'DOWN'; 

index   : INDEX; 
INTERFACENAME : [a-zA-Z0-9]+; 
INDEX   : [0-9]+; 

:

1001-eth0 up (index=110) 
1001-ip6gre0 DOWN (index=113) 

내가 할 때, 나는 다음과 같은 오류 얻을 :

line 1:20 mismatched input '110' expecting INDEX 
line 2:25 mismatched input '113' expecting INDEX 

이제 INDEX (규칙)는 [0-9] + 반복을 찾으면서 110 및 113과 일치해야합니다. 누군가 문법이나 입력에 명백한 문제를 발견합니까?

답변

0

귀하의 렉서 규칙 INTERFACENAME은 입력 110과 일치합니다. 이 규칙은 문법에 INDEX 앞에 있으므로 항상 우선합니다. 실제로이 문법은 이 아니며INTERFACENAME이 항상 색인과 일치하므로 현재 양식의 INDEX 토큰을 생성합니다.

또한 인해 파서 규칙의 문자 '1001'의 포함에 입력 1001 항상 INTERFACENAME 또는 INDEX 결코없는 고유 한 토큰이 될 않습니다. 1002, 10031004에도 동일하게 적용됩니다.

+0

그럼 어떻게 해결할 수 있습니까? 문법에 근본적인 "버그"가 있습니까? 어떻게 접근 했습니까? –

0

숫자를 사용하여 INTERFACENAME을 시작할 수 있습니까? 그렇지 않다면 다음과 같이 시도하십시오. INTERFACENAME : ([a-zA-Z]) ([a-zA-Z0-9]) *;

관련 문제