1

我的语法有一个小问题。

我正在尝试检测我的字符串是否是日期比较。但是我创建的 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

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

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

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

谁能解释我为什么会出现这样的错误,以及如何解决它?

这个问题是我完成任务的 q 个子集,我必须在其中区分很多比较(日期、地理、字符串……)。因此,我真的需要能够为我的原子赋予“标签”。

非常感谢你 !

作为补充,这是我当前的 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);
  }
}
4

1 回答 1

1

我终于明白了

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

因此语法稍作修改:

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

这给出了这个输出:

输出的 AST 图

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

希望它可以帮助某人。

于 2012-05-15T08:16:04.663 回答