Tsql 如何在Antlr4语法中实现EOF
我有一个用于TSQL类语言验证的语法。目前,语法规则将与语句一起使用,例如Tsql 如何在Antlr4语法中实现EOF,tsql,antlr4,grammar,Tsql,Antlr4,Grammar,我有一个用于TSQL类语言验证的语法。目前,语法规则将与语句一起使用,例如SUM(column1)+SUM(column2) 我希望解析器抛出一个错误,如果它给出了类似 SUM(第1列)SUM(第2列)。请注意,两个和之间缺少运算符。现在,如果我通过解析器运行此语句,它不会出错。相反,它将返回语句的第一部分,SUM(column1),并完全忽略语句的其余部分 经过研究,我相信我的问题的答案是在我的语法中增加一个EOF。我尝试了几种方法来实现这一点,但它对解析没有任何影响 这是在我的语法文件中,在
SUM(column1)+SUM(column2)
我希望解析器抛出一个错误,如果它给出了类似
SUM(第1列)SUM(第2列)
。请注意,两个和之间缺少运算符。现在,如果我通过解析器运行此语句,它不会出错。相反,它将返回语句的第一部分,SUM(column1)
,并完全忽略语句的其余部分
经过研究,我相信我的问题的答案是在我的语法中增加一个EOF。我尝试了几种方法来实现这一点,但它对解析没有任何影响
这是在我的语法文件中,在参数列表中实现它的最佳方式:
grammar DataAnalysis;
expression : literal #literalAtomExp
| FUNCTION=ID '(' argument_list ')' #functionExp
| INLINE_FUNCTION '(' argument_list ')' #inlineFunctionExp
| '(' expression ')' #parenthesisExp
| expression (ASTERISK|SLASH) expression #mulDivExp
| expression (PLUS|MINUS) expression #addSubExp
| <assoc=right> expression '^' expression #powerExp
| QUOTEDTEXT #stringExp
;
argument_list : expression (',' expression)* EOF //implemented here
;
literal : (TABLE_NAME=ID '.')? COLUMN_NAME=ID
| VALUE=NUMBER
;
fragment NAME : [a-zA-Z0-9_] ;
fragment LETTER : [a-zA-Z] ;
fragment DIGIT : [0-9] ;
ASTERISK : '*' ;
SLASH : '/' ;
PLUS : '+' ;
MINUS : '-' ;
INLINE_FUNCTION : 'YEAR'
| 'MONTH'
| 'DAY'
;
NUMBER : ('-')? DIGIT+ ('.' DIGIT+)? ;
ID : LETTER (NAME+) ;
QUOTEDTEXT : '"' .*? '"' ;
WHITESPACE : ' ' -> channel(HIDDEN);
语法数据分析;
表达式:literal#literalAtomExp
|FUNCTION=ID'('argument_list')'#functionExp
|内联函数“('argument_list')”#内联函数exp
|“(“表达式”)”#括号
|表达式(星号|斜杠)表达式#mulDivExp
|表达式(加|减)表达式#addSubExp
|表达式“^”表达式#powerExp
|QUOTEDTEXT#stringExp
;
参数列表:表达式(','表达式)*EOF//在此处实现
;
文字:(TABLE_NAME=ID'.')?列名称=ID
|值=数字
;
碎片名称:[a-zA-Z0-9_];
碎片字母:[a-zA-Z];
碎片数字:[0-9];
星号:'*';
斜杠:“/”;
加:“+”;
减:'-';
内联函数:“年”
|“月”
|“一天”
;
编号:('-')?数字+('.'数字+);
ID:字母(姓名+);
QUOTEDTEXT:“'.*?”;
空白:“”->通道(隐藏);
即使这样,解析也不会发现问题,只返回查询的第一部分
总而言之,当我向解析器提供SUM(column1)SUM(column2)
时,我希望它返回一个错误,因为它没有任何与这种情况相关的规则
不知道我错过了什么。感谢您的指导。使用“expr\u prime:expression EOF;”扩充语法,并从参数列表规则中删除EOF。用expr_prime()开始解析。我最后只是把它称为“parse”,而不是“expr_prime”。我相信下划线给了我一些问题。