如何解决多余的输入“-”,期望{DECIMAL,'+','-'}
使用最新的Antlr运行时4.6.6, 我正在尝试处理带符号的数字,无法弄清楚我在做什么错。从Tsql语法中清除示例,我使用以下内容来解析带符号的数字:
time_expression
: interval=(YEARS|MONTHS|DAYS|HOURS|MINUTES) '(' signed_decimal ')'
;
signed_decimal
:sign? DECIMAL
;
对于没有签名的数字,它都可以正常工作,但是当我尝试解析:Test > MONTHS(-537)
时,出现此错误:extraneous input '-' expecting {DECIMAL,'+','-'}
这是我的词法分析语法:
lexer grammar QLexer;
@modifier{internal}
FROM: 'FROM';
IN: 'IN';
NULL: 'NULL';
OR: 'OR';
IS: 'IS';
AND: 'AND';
NOT: 'NOT';
PARENT: 'PARENT';
YEARS: 'YEARS';
MONTHS: 'MONTHS';
DAYS: 'DAYS';
HOURS: 'HOURS';
MINUTES: 'MINUTES';
HASTAG: 'HASTAG';
ParaGRAPH: (NEWLINE NEWLINE);
TAB: [ \t\r\n]+ -> skip;
// https://docs.microsoft.com/en-us/sql/t-sql/language-elements/slash-star-comment-transact-sql
COMMENT: '/*' (COMMENT | .)*? '*/' -> channel(HIDDEN);
LINE_COMMENT: '--' ~[\r\n]* -> channel(HIDDEN);
// Todo: ID can be not only Latin.
EMbedED_sql: '{' (.)*? '}';
DOUBLE_QUOTE_ID: '"' ~'"'+ '"';
SINGLE_QUOTE: '\'';
SQUARE_BRACKET_ID: '[' ~']'+ ']';
LOCAL_ID: '@' ID;
TEST_ID: '#' ID;
DECIMAL: DEC_DIGIT+;
ID: ([A-Za-z0-9_])+;
STRING: 'N'? '\'' (~'\'' | '\'\'')* '\'';
BINARY: '0' 'X' HEX_DIGIT*;
EQUAL: '=';
GREATER: '>';
LESS: '<';
EXCLAMATION: '!';
PLUS_ASSIGN: '+=';
MINUS_ASSIGN: '-=';
MULT_ASSIGN: '*=';
DIV_ASSIGN: '/=';
MOD_ASSIGN: '%=';
AND_ASSIGN: '&=';
XOR_ASSIGN: '^=';
OR_ASSIGN: '|=';
ARITHMETIC: '*' | '/'|'+' | '-';
DOUBLE_BAR: '||';
DOT: '.';
UNDERLINE: '_';
AT: '@';
SHARP: '#';
DOLLAR: '$';
LR_BRACKET: '(';
RR_BRACKET: ')';
COMMA: ',';
SEMI: ';';
COLON: ':';
STAR: '*';
DIVIDE: '/';
MODULE: '%';
PLUS: '+';
MINUS: '-';
BIT_NOT: '~';
BIT_OR: '|';
BIT_AND: '&';
BIT_XOR: '^';
NUM : '[0-9]+ ('.' [0-9]+)?';
SIGNED_NUMBER: '^-?[1-9][0-9]{0,2}$';
UNSIGNED_INT : ('0' | '1'..'9' '0'..'9'*);
HEX_DIGIT: [0-9A-F];
DEC_DIGIT: [0-9];
//fragment Exponent : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;
fragment LETTER: [A-Z_];
//fragment DEC_DOT_DEC: (DEC_DIGIT+ '.' DEC_DIGIT+ | DEC_DIGIT+ '.' | '.' DEC_DIGIT+);
//fragment HEX_DIGIT: [0-9A-F];
//fragment DEC_DIGIT: [0-9];
fragment NEWLINE: '\r'? '\n';
解决方法
您的规则:
NUM : '[0-9]+ ('.' [0-9]+)?';
SIGNED_NUMBER : '^-?[1-9][0-9]{0,2}$';
匹配文字字符串。您的意思可能是这样的:
NUM : [0-9]+ ('.' [0-9]+)?;
SIGNED_NUMBER : '-'? [1-9] ([0-9] [0-9]?)?;
您可能还希望让signed_decimal
与SIGNED_NUMBER
相匹配:
signed_decimal
: sign? DECIMAL
| SIGNED_NUMBER
;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。