代码之家  ›  专栏  ›  技术社区  ›  Mauli

ANTLR(field=value),如何表示?

  •  1
  • Mauli  · 技术社区  · 15 年前

    我是一个全新的词法分析器和语法分析器,所以请耐心点。最后,我希望能够表示LDAP样式的查询字符串,例如,'(foo=bar)'','(!foo=bar)',(&foo=bar)(!zip=zap)),并在末尾有一个树,我可以用它来创建实际的数据库查询(或其他什么)

    grammar FilterExpression;
    
    options
    {
        language=Java;
        k=2;
    }
    
    tokens
    {
        NOT='!';
    }
    
    term    :   '(' NOT? FIELD '=' VALUE ')';
    // lexer
    FIELD   :   NAME;
    VALUE   :   CDATA;
    
    fragment NAME
        :   ALPHA+;
    fragment CDATA
        :   ALPHA*;
    fragment ALPHA
        :   ('a'..'z' | 'A'..'Z');
    
    2 回复  |  直到 15 年前
        1
  •  2
  •   a_m0d    15 年前

    好吧,你走对了。只是一些你需要改变的事情。你必须表达 字段名 字段值 价值 可选的,只需使解析器术语可选(用“?”键)在它后面)。下面是用修改后的语法生成的解析树(希望这就是您所追求的)。我还把修改过的语法贴在了我的答案的底部。
    alt text http://img268.imageshack.us/img268/7374/graphw.png

    grammar FilterExpression;
    
    options
    {
        language=Java;
        k=2;
    }
    
    tokens
    {
        NOT='!';
    }
    
    term    :       '(' NOT? field '=' value? ')';
    // lexer
    field   :       ID;
    value   :       ID;
    
    ID  :   ALPHA+
        ;
    
    fragment ALPHA
        :   ('a'..'z' | 'A'..'Z');
    
        2
  •  0
  •   Sam Martin    15 年前

    term    :       '(' NOT? field '=' value ')';
    
    field : IDENTIFIER ;
    
    value : IDENTIFIER? ;
    
    // lexer
    IDENTIFIER : ALPHA+ ;
    
    fragment ALPHA
        :   ('a'..'z' | 'A'..'Z');
    

    由于lexer无法区分字段和值,因此需要让lexer对它们进行相同的处理,并使用解析器根据上下文来区分差异。