ANTLR和DSL解析傻瓜:空白处理

时间:2009-04-06 19:54:28

标签: antlr

我正在尝试开发一个用于软件配置的迷你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语法是琐碎的和完整的语言)。

1 个答案:

答案 0 :(得分:4)

通常,您可以通过添加

来完成此操作
{ $channel=HIDDEN; }

WS规则的操作;有关详细信息,请参阅this page, section Lexer rules