假人的ANTLR和DSL解析:空白处理

假人的ANTLR和DSL解析:空白处理,antlr,Antlr,我正在尝试开发一个用于软件配置的迷你DSL,使用antlworks进行原型设计。典型的来源如下所示: name: myname; value: myvalue; flag debug { value = debugvalue; } if flag(debug) { libname = foo_d; } else { libname = foo; } 现在,我从未上过语法分析的正式课程,所以我通过antlworks的试错和一些BNF语法的基础知识来完成这一切。我经常遇到的一个问

我正在尝试开发一个用于软件配置的迷你DSL,使用antlworks进行原型设计。典型的来源如下所示:

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语法不是简单的就是成熟的语言)。

通常,你可以通过添加

{ $channel=HIDDEN; }

WS
规则的操作;有关详细信息,请参阅。

谢谢。我可以发誓我试过了,但没有成功,但是有了文档,我可以让它按预期工作。而且,一旦这样做了,就不需要在解析器规则中包含WS。