我正在尝试开发一个用于软件配置的迷你 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 语法要么是简单的语言,要么是成熟的语言)。