2009-04-06 3 views
2

prototyping을 위해 antlworks를 사용하여 소프트웨어 구성을위한 미니 DSL을 개발하려고합니다. 내가 구문 분석에 대한 공식적인 과정을 가진 적이 없어 지금ANLR 및 DSL 구문 분석 : 공백 처리

name: myname; 
value: myvalue; 
flag debug { 
    value = debugvalue; 
} 
if flag(debug) { 
    libname = foo_d; 
} else { 
    libname = foo; 
} 

, 그래서 나는 antlworks과 BNF 문법에 대한 몇 가지 기초부터 시행/오류로이 모든 일을 오전 : 일반적인 소스는 같을 것이다. 내가 만나는 하나의 지속적인 문제는 공백과 개행 처리입니다. 나는 다음과 같이 정의했다.

program: statement* EOF; 

statement: compound_statement | selection_statement | field_statement; 
selection_statement: 'if' expr statement; 
statement_list: (WS* statement)+; 
compound_statement: '{' statement_list? '}'; 
field_statement: name_statement | value_statement; 
name_statement: 'name' WS* ':' WS* WORD WS* ';'; 
value_statement: 'value' WS* ':' WS* WORD WS* ';'; 

// Tokens 
WS : (' ' | '\t' | '\n'); 
WORD: ('a'..'z'|'A'..'Z')('a'..'z'|'A'..'Z'|'0'..'9'|'_')*; 

그러나 공백 처리는 매우 버그가 있으며, 모든 경우에 문제가된다. 이것을 표준 방법으로하는 것은 무엇입니까? 이런 종류의 것들을 빨리 배울 수있는 리소스가 있습니까? (조건부 및 변수가있는 계산기를 antlr로 작성하는 것과 같은 것 - 발견 된 antlr 문법은 사소하고 완전한 언어입니다). 보통

답변

4

, 당신은 WS 규칙에

{ $channel=HIDDEN; } 

조치를 추가하여이 작업을 수행 할 것; 자세한 내용은 this page, section Lexer rules을 참조하십시오.

+0

감사합니다. 나는 성공하지 않고 이것을 시도했다고 맹세 할 수는 있지만, 문서화를 통해 나는 의도 한대로 작동하게 할 수있다. –

+0

또한 일단 그렇게하면 파서 규칙에 WS를 포함 할 필요가 없습니다. –