我的语法问题很小。
我正在尝试检测我的字符串是否是日期比较。 但是我创建的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);
}
}
答案 0 :(得分:1)
我终于明白了,
似乎即使我删除了空格,我仍然必须将它们包含在包含空格的表达式中。 此外,第二个定义中存在一个小错误,因为第二个数字是可选的。
因此语法略有修改:
fragment SECOND : DIGIT (DIGIT)? ('.' (DIGIT)+)?;
给出了这个输出:
我知道希望这仍然适用于我更完整的语法:)
希望它有所帮助。