将字符串与Lexer匹配:'期待'错误

时间:2012-05-15 07:44:09

标签: java parsing antlr

我的语法问题很小。

我正在尝试检测我的字符串是否是日期比较。 但是我创建的DATE词法分析器似乎不被antlr识别,我得到一个我无法解决的错误。

这是我的输入表达式:

"FDT > '2007/10/09 12:00:0.0'"

我只是希望这样一棵树作为输出:

    COMP_OP
FDT        my_DATE

这是我的语法:

    // Aiming at parsing a complete BQS formed Query
grammar Logic;

options {
    output=AST;
}

/*------------------------------------------------------------------
 * PARSER RULES
 *------------------------------------------------------------------*/

 // precedence order is (low to high): or, and, not, [comp_op, geo_op, rel_geo_op, like, not like, exists], ()
 parse  
    : expression EOF -> expression
    ; // ommit the EOF token

 expression
    : query
    ;       

 query
    : atom (COMP_OP^ DATE)* 
    ;

//END BIG PART

 atom   
    : ID 
    | | '(' expression ')' -> expression
    ;

/*------------------------------------------------------------------
 * LEXER RULES
 *------------------------------------------------------------------*/
// GENERAL OPERATORS: 

DATE        :   '\'' YEAR '/' MONTH '/' DAY (' ' HOUR ':' MINUTE ':' SECOND)? '\'';
ID          :   (CHARACTER|DIGIT|','|'.'|'\''|':'|'/')+;
COMP_OP     :   '=' | '<' | '>' | '<>' | '<=' | '>=';

WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+    { $channel = HIDDEN; } ;


fragment YEAR   :   DIGIT DIGIT DIGIT DIGIT;
fragment MONTH  :   DIGIT DIGIT;
fragment DAY    :   DIGIT DIGIT;
fragment HOUR   :   DIGIT DIGIT;
fragment MINUTE :   DIGIT DIGIT;
fragment SECOND :   DIGIT DIGIT ('.' (DIGIT)+)?;

fragment DIGIT  :   '0'..'9' ;
fragment DIGIT_SEQ  :(DIGIT)+;
fragment CHARACTER :    ('a'..'z' | 'A'..'Z');

作为输出错误,我得到:

line 1:25 mismatched character '.' expecting set null
line 1:27 mismatched input ''' expecting DATE

我还尝试从我的日期中删除''(认为这可能是问题,因为我在语法中删除它们。)

在这种情况下,我收到此错误:

line 1:6 mismatched input ''2007/10/09' expecting DATE

任何人都可以解释我为什么会出现这样的错误,以及如何解决它?

这个问题是我完成任务的第二部分,我必须区分大量的omparisons(日期,地理,字符串,...)。因此,我真的需要能够为我的原子提供“标签”。

非常感谢!

作为补充,这是我当前的Java代码:

import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
import org.antlr.stringtemplate.*;

public class Main {
  public static void main(String[] args) throws Exception {

    // the expression
    String src = "FDT > '2007/10/09 12:00:0.0'";

    // create a lexer & parser
    //LogicLexer lexer = new LogicLexer(new ANTLRStringStream(src));
    //LogicParser parser = new LogicParser(new CommonTokenStream(lexer));

    LogicLexer lexer = new LogicLexer(new ANTLRStringStream(src));
    LogicParser parser = new LogicParser(new CommonTokenStream(lexer));

    // invoke the entry point of the parser (the parse() method) and get the AST
    CommonTree tree = (CommonTree)parser.parse().getTree();

    // print the DOT representation of the AST 
    DOTTreeGenerator gen = new DOTTreeGenerator();
    StringTemplate st = gen.toDOT(tree);
    System.out.println(st);
  }
}

1 个答案:

答案 0 :(得分:1)

我终于明白了,

似乎即使我删除了空格,我仍然必须将它们包含在包含空格的表达式中。 此外,第二个定义中存在一个小错误,因为第二个数字是可选的。

因此语法略有修改:

fragment SECOND :   DIGIT (DIGIT)? ('.' (DIGIT)+)?;

给出了这个输出:

AST graph of the output

我知道希望这仍然适用于我更完整的语法:)

希望它有所帮助。