2017-11-20 18 views
0

파일의 다음 행을 구문 분석하고 학생 이름과 나이를 별도로 식별하고 싶습니다.ANTLR 중간에 공백이있는 문자열을 처리하는 방법

Student Tim Jonh (25) 
Student Mack Woo (30) 

연령은 숫자이며 중간에 공백이있을 수도 있고 없을 수도 있습니다. 나는 위의 ANTLR 문법 다음에 만들었습니다.

그러나 이름을 여러 단어로 구문 분석합니다. 하지만 저는 중간에 공백이있는 "Tim Jonh"또는 "Mack Woo"와 같이 가져 가고 싶습니다. 즉, 중간에 2 개의 공백이 있으면 그대로 읽어야합니다.

grammar school; 

students  : (student)*      ; 
student   : 'Student' studentname '(' age ')' ; 
studentname  : (NAME)+       ; 
age    : INT        ; 
NAME   : [a-zA-Z]+       ; 
INT    : [0-9]+       ; 

WS    : [ \t\r\n]+ -> skip    ; 

문법을 어떻게 변경해야하는지 알려주십시오.

이 질문은 준비되었으므로 응용 프로그램에 여러 단어로 이름을 읽는 것이 실제로는 효과가 없다고 생각하십시오.

답변

2
grammar school; 

students  : (student)*      ; 
student   : 'Student' studentname '(' age ')' ; 
studentname  : NAME        ; 
age    : INT        ; 
NAME   : WORD (WS WORD)*     ; 
fragment WORD : [a-zA-Z]+       ; 
INT    : [0-9]+       ; 

WS    : [ \t\r\n]+ -> skip    ; 
+0

대신 'studentname :: WORD +;'를 사용합니다. 그것은 더 간단하고 많은 수의 공백에도 적용됩니다. 두 개의 이름 부분 사이에 두 번째 공백 문자를 추가하면 지정된 솔루션이 실패합니다. –

+0

@MikeLischke 학생 이름 당 두 개의 토큰을 만들어 낼 것입니다. 아니면 OP가 원래 게시 한 것과 다를 것이 있습니까? 또한 'WS'는'1..n' 반복으로 정의되기 때문에 두 번째 공간은 중단되지 않습니다. –

+0

당신이 옳았는데 모든 것이 하나의 토큰에 머물러야하는지 여부는 OP의 사용 시나리오에 따라 다릅니다. 공백은 거의 모든 언어 구분 기호에 있기 때문에 매우 드문 경우입니다. –