2011-09-05 2 views
1

나는이 같은 ANTLR 문법이 공백을 처리합니다. 이 방법으로 작동하지 않습니다. 문자열을 helloqwerty;으로 변경하면 모든 것이 정상입니다. 또한 문법을 ​​다음과 같이 변경할 수 있습니다.만들기 ANTLRWorks 자동

grammar HelloGrammar2; 

ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ; 
STATEMENT : 'hello' WS ID WS ';' ; 
WS : (' '|'\t'|'\r'|'\n')* ; 

그리고이 경우 hello qwerty ;이 정상적으로 작동합니다. ANTLR이 공백을 자동으로 건너 뛸 수있게 할 수 있습니까? 내가 ANTLRWorks에서 테스트하고 있습니다 : 그것은 의미가있는 경우

업데이트

을 - (즉 내가 hello qwerty ;와 HelloGrammar1 작업을 만들고 싶어).

grammar HelloGrammar; 

ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ; 
STATEMENT : 'hello' ID ';' ; 
WS : (' '|'\t'|'\r'|'\n') { $channel = HIDDEN; } ; 

가 여전히 작동하지 않습니다 : 2

업데이트는 또한이 방법을 시도했다.

내가 선택 "문"규칙 "통역"탭을 사용하고 3

업데이트.

+0

허용되는 입력은 무엇이 필요합니까? – luketorjussen

+0

렉서 규칙은 영 (0) 문자 (빈 문자열)와 (잠재적으로) 일치 할 수있는 토큰을 만들어서는 안됩니다. 렉서는 무한한 양의 렉서를 생성합니다. '(' '|'\ t '|'\ '|'\ n ')'또는'(' '' '\ t'| '\ r'| '\ n') +'. –

답변

2

나는 문제가 당신이 (파서 규칙) ANTLRWorks에서

grammar HelloGrammar; 

statement : 'hello' ID ';' ; 
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ; 
WS : (' '|'\t'|'\r'|'\n') { $channel = HIDDEN; } ; 

이 수용에 진술 (현재 렉서 규칙)을 변경해야 할 수 있습니다 생각 :

hello qwerty; 
hello qwerty; 
hello loki2302; 
hello qwerty ; 

을 허용하지만 허용하지 않음 :

helloqwerty; 
helloqwerty ; 
hello; 
hello qwerty 
관련 문제