Antlr4语法中如何实现EOF
How to implement EOF in Antlr4 Grammar
我有一个用于 TSQL 式语言验证的语法。目前,语法规则适用于 SUM(column1) + SUM(column2)
.
等语句
我希望解析器在给出如下内容时抛出错误
SUM(column1) SUM(column2)
。注意两个 SUM 之间缺少运算符。现在,如果我 运行 这个语句通过解析器它不会出错。相反,它将 return 语句的第一部分 SUM(column1)
并完全忽略语句的其余部分。
经过研究,我相信我的问题的答案是在我的语法中添加一个 EOF。我尝试过以多种方式实现它,但它对解析没有任何影响。
这是我认为在 argument_list:
语法文件中实现它的最佳方式
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);
即使这样,解析也没有解决问题,return只是查询的第一部分。
总而言之,当我向解析器 SUM(column1) SUM(column2)
提供信息时,我希望它 return 出现错误,因为它没有针对该情况的任何关联规则。
不知道我错过了什么。感谢您的指导。
使用 "expr_prime : expression EOF;" 扩充语法,并从 argument_list 规则中删除 EOF。使用 expr_prime().
开始解析
我有一个用于 TSQL 式语言验证的语法。目前,语法规则适用于 SUM(column1) + SUM(column2)
.
我希望解析器在给出如下内容时抛出错误
SUM(column1) SUM(column2)
。注意两个 SUM 之间缺少运算符。现在,如果我 运行 这个语句通过解析器它不会出错。相反,它将 return 语句的第一部分 SUM(column1)
并完全忽略语句的其余部分。
经过研究,我相信我的问题的答案是在我的语法中添加一个 EOF。我尝试过以多种方式实现它,但它对解析没有任何影响。
这是我认为在 argument_list:
语法文件中实现它的最佳方式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);
即使这样,解析也没有解决问题,return只是查询的第一部分。
总而言之,当我向解析器 SUM(column1) SUM(column2)
提供信息时,我希望它 return 出现错误,因为它没有针对该情况的任何关联规则。
不知道我错过了什么。感谢您的指导。
使用 "expr_prime : expression EOF;" 扩充语法,并从 argument_list 规则中删除 EOF。使用 expr_prime().
开始解析