'2007-6ren">
gpt4 book ai didi

java - 将字符串与词法分析器匹配 : 'expecting' error

转载 作者:太空宇宙 更新时间:2023-11-04 08:14:56 24 4
gpt4 key购买 nike

我的语法有一个小问题。

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

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

这个问题是我完整任务的一部分,我必须区分许多比较(日期、地理、字符串……)。因此,我确实需要能够为我的原子提供“标签”。

非常感谢!

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

最佳答案

终于明白了

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

语法略有修改:

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

给出了这个输出:

AST graph of the output

我知道希望这在我更完整的语法中仍然有效:)

希望它对某人有帮助。

关于java - 将字符串与词法分析器匹配 : 'expecting' error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10596278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com