1

文法に小さな問題があります。

文字列が日付比較かどうかを検出しようとしています。しかし、私が作成した DATE lexer は antlr によって認識されないようで、解決できないエラーが発生します。

これが私の入力式です:

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

私は単純にそのようなツリーを output として期待しています:

    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

このようなエラーが発生する理由と、それを解決する方法を誰かに説明してもらえますか?

この質問は、私の完全なタスクの一部であり、多くの比較 (日付、地理、文字列など) を区別する必要があります。したがって、アトムに「タグ」を付けることができる必要があります。

どうもありがとうございました !

補足として、これが私の現在の 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

やっと手に入れた、

空白を削除しても、空白を含む式に空白を含める必要があるようです。さらに、2 桁目はオプションであったため、2 番目の定義に小さな誤りがありました。

したがって、文法はわずかに変更されます。

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

この出力が得られます:

出力のASTグラフ

これが私のより完全な文法でも機能することを願っています:)

それが誰かを助けることを願っています。

于 2012-05-15T08:16:04.663 に答える