代码之家  ›  专栏  ›  技术社区  ›  David Cournapeau

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

  •  2
  • David Cournapeau  · 技术社区  · 17 年前

    我正在尝试开发一个用于软件配置的微型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 回复  |  直到 17 年前
        1
  •  4
  •   jpalecek    17 年前

    通常,您可以通过添加

    { $channel=HIDDEN; }
    

    对…的行动 WS 规则;见 this page, section Lexer rules 详情。

    推荐文章