简体   繁体   中英

Match String to Lexer : 'expecting' error

I have a small problem with my grammar.

I am trying to detect whether my string is a date comparison or not. But the DATE lexer I created seem not to be recognized by antlr, and I get an error that I cannot solve.

Here is my input expression :

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

I simply expect such a tree as output :

    COMP_OP
FDT        my_DATE

Here is my grammar :

    // 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');

As an output error, I get :

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

I also tried to remove the ' ' from my Date (thinking that it was perhaps the problem, as I remove them in the grammar.)

In this case, I get this error :

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

Can anyone explain me why I get such an error, and how I could solve it ?

This question is q subset of my complete task, where I have to differentiate lots of omparisons (dates, geographic, strings, . . .). I would thus really need to be able to give 'tags' to my atoms.

Thank you very much !

As a complement, here is my current Java code :

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);
  }
}

I finally got it,

Seems like even though I remove whitespaces, I still have to include them in expressions that contain one. In addition, there was a small error in second definition, as the second digit was optional.

The grammar is thus slightly modified :

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

which gives this output :

输出的AST图

I know hope this will still work in my more complete grammar :)

Hope it helps someone.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM