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 문법은 사소하고 완전한 언어입니다). 보통
감사합니다. 나는 성공하지 않고 이것을 시도했다고 맹세 할 수는 있지만, 문서화를 통해 나는 의도 한대로 작동하게 할 수있다. –
또한 일단 그렇게하면 파서 규칙에 WS를 포함 할 필요가 없습니다. –