.net core 无关输入'-';应为{DECIMAL,';+;';';-';}

.net core 无关输入'-';应为{DECIMAL,';+;';';-';},.net-core,antlr4,.net Core,Antlr4,使用最新的Antlr运行时4.6.6, 我试图处理签名数字,但不知道我做错了什么。从TSQL语法中清除样本时,我使用以下方法来解析带符号的数字: time_expression : interval=(YEARS|MONTHS|DAYS|HOURS|MINUTES) '(' signed_decimal ')' ; signed_decimal :sign? DECIMAL ; 对于无符号数字,它可以正常工作,但当我尝试分析:Test>MONTHS(-537)时,我得到一个错误:extern

使用最新的Antlr运行时4.6.6, 我试图处理签名数字,但不知道我做错了什么。从TSQL语法中清除样本时,我使用以下方法来解析带符号的数字:

time_expression
: interval=(YEARS|MONTHS|DAYS|HOURS|MINUTES) '(' signed_decimal ')'
;

signed_decimal
:sign? DECIMAL
;
对于无符号数字,它可以正常工作,但当我尝试分析:
Test>MONTHS(-537)
时,我得到一个错误:
externeous input'-'应为{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';
lexer语法QLexer;
@修饰符{internal}
FROM:'FROM';
IN:'IN';
空:“空”;
或:‘或’;
是‘是’;
和:'和';
不是‘不是’;
家长:‘家长’;
年:“年”;
月:“月”;
天:“天”;
小时:“小时”;
分钟:“分钟”;
HASTAG:‘HASTAG’;
段落:(换行符换行符);
选项卡:[\t\r\n]+->跳过;
// https://docs.microsoft.com/en-us/sql/t-sql/language-elements/slash-star-comment-transact-sql
注释:“/*”(注释|.*?“*/”->通道(隐藏);
行注释:'--'~[\r\n]*->通道(隐藏);
//TODO:ID不仅可以是拉丁语。
嵌入的_-SQL:'{'(.*?'}';
双引号ID:““~”“+”;
单引号:“\”;
方括号_ID:'['~']'+']';
本地_ID:“@”ID;
测试ID:“#”ID;
十进制:十进制数字+;
ID:([A-Za-z0-9])+;
字符串:“N'?'\”(~'\'''\''\''\'''\'''.'')\''''.'';
二进制:“0”X“十六进制数字*;
相等:'=';
更大:“>”;
减去:“你的规则:

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\u decimal
匹配
signed\u NUMBER

signed_decimal
 : sign? DECIMAL
 | SIGNED_NUMBER
 ;

你能编辑你的问题并发布足够多的语法,以便其他人可以重现你提到的错误吗?谢谢你的建议,问题更新了你没有发布你的语法分析器,所以仍然有点猜测出了什么问题。发现了问题,是ID标记,我将它移到了底部,现在它工作了。感谢提示Brat。它当我尝试使用刚签名的_号码时也失败了。我现在正试图用一个小程序重现这个问题。很可能我做了一些非常愚蠢的事情,但无论如何都会在这里发布我的发现。