.net core 无关输入'-';应为{DECIMAL,';+;';';-';}
使用最新的Antlr运行时4.6.6, 我试图处理签名数字,但不知道我做错了什么。从TSQL语法中清除样本时,我使用以下方法来解析带符号的数字:.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
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。它当我尝试使用刚签名的_号码时也失败了。我现在正试图用一个小程序重现这个问题。很可能我做了一些非常愚蠢的事情,但无论如何都会在这里发布我的发现。