2013-09-23 2 views
1

antlr4를 사용하여 ssh 명령 결과를 구문 분석하려고하지만이 코드가 작동하지 않는 이유를 알 수 없으므로 "외부 입력"오류가 계속 발생합니다.Antlr4 - 멀티 라인 파일 용 파서 -

listAll 
    : (system | home | NL)* 
    ; 

elements 
    : (sp | cpu)* 
    ; 

home 
    : 'home[' number ']' value NL elements 
    ; 

system 
    : 'system' NL 
    ; 

sp 
    : 'sp' NL 
    ; 

cpu 
    : 'cpu[' number ']' NL 
    ; 

value 
    : VALUE 
    ; 

number 
    : INT 
    ; 

VALUE : STRING+; 
STRING: ('a'..'z'|'A'..'Z'| '-' | ' ' | '(' | ')' | '/' | '.' | '[' | ']'); 
INT : ('0'..'9')+ ; 
NL : '\r'? '\n'; 
WS :  (' '|'\t')* {skip();} ; 

진입 점은 'listAll'입니다 :

system 
home[1] HOME-NEW 
    sp 
    cpu[1] 
    cpu[2] 
home[2] SECOND-HOME 
    sp 
    cpu[1] 
    cpu[2] 

가 여기 내 문법 파일입니다 : 여기

내가 구문 분석하는 데 노력하고있어 파일의 샘플입니다.

(listAll \r\n (system system \r\n) home[1] HOME-NEW \r\n sp \r\n cpu[1] \r\n cpu[2] \r\n[...]) 

는 구문 분석은 '시스템'후 실패 는 여기에 내가 얻을 결과입니다. 그리고이 오류가 발생합니다 : 라인 2 : 1 외부 입력 'home [1] HOME-NEW'기대하는 시스템, NL, WS}

이것이 작동하지 않는 이유를 아는 사람이 있습니까? 저는 Antlr의 초보자입니다. 어떻게 작동하는지 정말 잘 모르겠습니다. 감사합니다.

답변

0

당신은 하나 개의 WS 요소로 NLWS을 결합 -> skip (안 {skip()})

를 사용하여 건너 뛰고 WS이 자동으로 생략되기 때문에, 필요가 모든 규칙을 지정하지 않는해야합니다.

또한 STRINGspace (' ')이며 오류를 유발하여 다음 입력을 처리합니다. 난 당신이 ANTLR4 Documentation

+0

을 통해 이동하는 것이 좋습니다 것입니다, 또한

listAll : (system | home)* ; elements : (sp | cpu)* ; home : 'home[' number ']' value elements; system : 'system' ; sp : 'sp' ; cpu : 'cpu[' number ']' ; value : VALUE ; number : INT ; VALUE : STRING+; STRING : ('a'..'z'|'A'..'Z'| '-' | '(' | ')' | '/' | '.' | '[' | ']') ; INT : [0-9]+ ; WS : [ \t\r\n]+ -> skip ; 

나에게 많은 도움이, 대단히 감사합니다 :

여기에 완전한 문법이다. 내 실수는 값에 숫자가 포함될 수 있기 때문에 STRING 토큰에 '['와 ']'를 넣는 것이 었습니다. 따라서 '집 [1] EXAMPLE-1'과 같은 것이있을 때 집은 '집' 또는 '가치'. 코드가 잘 작동합니다! 그리고 탭, 스페이스 및 라인 끝을 건너 뛰는 팁을 주셔서 감사합니다. – zaphod

+0

도와 주셔서 감사합니다 :) –