如何解决ANTLR 4错误50-字符“ i”不匹配,期望“ {”
ANTLR4新手在这里!
我正在尝试创建我的第一个ANTLR4语法-一个小的Oracle sql * Loader-但似乎无法摆脱困境!
当我通过推荐别名antlr4运行语法时,收到以下错误消息:
error(50): HQLLDR.g4::: Syntax error: mismatched character 'i' expecting '{'
我以为该错误是由使用ANTLR4关键字(例如OPTIONS)引起的,因此我将代码更改为使用OPTS,但是该错误仍然存在。
这是语法:
grammar HQLLDR;
hqlldr: hqlhdr hqlbody ;
hqlhdr: LOAD DATA ;
hqlbody: hql_express hql_full ;
hql_express: infile_express ;
hql_full: options infile tbldefn fielddefn datalines ;
opts: OPTS '(' opt ( ',' opt )* ')' ;
opt: skipit | database | schema ;
skipit: SKIPIT '=' DIGIT+ ;
database: DATABASE '=' OBJNM ;
schema: SCHEMA '=' OBJNM ;
infile_express: INFILE filelist_express ;
filelist_express: '(' '"' file_express '"' ')' ;
file_express: TEXT ;
infile: INFILE (DATALInes | filelist)? ;
filelist: '(' '"' file '"' ( ',' '"' file '"' )* ')' ;
file: TEXT ;
tbldefn: (TruncATE | APPEND | CREATE) INTO TABLE tblnm ;
tblnm: OBJNM OBJDESC? ;
fielddefn: termdefn encdefn? fieldlist ;
termdefn: TERMINATED BY DELIMITER terminators ;
terminators: (TAB|SEMICOLON|COMMA|COLON|SPACE) ;
encdefn: ENCLOSED BY ENCLOSURE enclosures ;
enclosures: (DOUBLEQUOTE|APOSTROPHE) ;
fieldlist: '(' fieldname fielddesc? fielddatatype ( ',' fieldname fielddesc? fielddatatype )* ')' ;
fieldname: OBJNM ;
fielddesc: OBJDESC? ;
fielddatatype: (BIGINT | INT | SMALLINT | tinyint | TIMESTAMP | STRING | FLOAT | DOUBLE) ;
datalines: ROWTEXT '\r'? '\n' ;
ROWTEXT: ~[\n\r]+ ;
LETTER: [a-zA-Z_] ;
DIGIT: [0-9] ;
LOAD: [Ll][Oo][Aa][Dd] ;
DATA: [Dd][Aa][Tt][Aa] ;
OPTS: [Oo][Pp][Tt][Ii][Oo][Nn][Ss] ;
SKIPIT: [Ss][Kk][Ii][Pp] ;
DATABASE: [Dd][Aa][Tt][Aa][Bb][Aa][Ss][Ee] ;
SCHEMA: [Ss][Cc][Hh][Ee][Mm][Aa] ;
INFILE: [Ii][Nn][Ff][Ii][Ll][Ee] ;
DATALInes: [Dd][Aa][Tt][Aa][Ll][Ii][Nn][Ee][Ss] ;
TruncATE: [Tt][Rr][Uu][Nn][Cc][Aa][Tt][Ee] ;
APPEND: [Aa][Pp][Pp][Ee][Nn][Dd] ;
CREATE: [Cc][Rr][Ee][Aa][Tt][Ee] ;
INTO: [Ii][Nn][Tt][Oo] ;
TABLE: [Tt][Aa][Bb][Ll][Ee] ;
FIELDS: [Ff][Ii][Ee][Ll][Dd][Ss] ;
TERMINATED: [Tt][Ee][Rr][Mm][Ii][Nn][Aa][Tt][Ee][Dd] ;
BY: [Bb][Yy] ;
ENCLOSED: [Ee][Nn][Cc][Ll][Oo][Ss][Ee][Dd] ;
OBJDESC: '(' '"' .*? '"' ')' ;
OBJNM: LETTER+ (LETTER | DIGIT)* ;
TEXT: ~[,\n\r"']+ ;
TAB: [Tt][Aa][Bb] ;
SEMICOLON: [Ss][Ee][Mm][Ii][Cc][Oo][Ll][Oo][Nn] ;
COMMA: [Cc][Oo][Mm][Mm][Aa] ;
COLON: [Cc][Oo][Ll][Oo][Nn] ;
SPACE: [Ss][Pp][Aa][Cc][Ee] ;
DELIMITER: (TAB | SEMICOLON | COMMA | COLON | SPACE) ;
DOUBLEQUOTE: [Dd][Oo][Uu][Bb][Ll][Ee][Qq][Uu][Oo][Tt][Ee] ;
APOSTROPHE: [Aa][Pp][Oo][Ss][Tt][Rr][Oo][Pp][Hh][Ee] ;
ENCLOSURE: (DOUBLEQUOTE | APOSTROPHE) ;
BIGINT: [Bb][Ii][Gg][Ii][Nn][Tt] ;
INT: [Ii][Nn][Tt] ;
SMALLINT: [Ss][Mm][Aa][Ll][Ll][Ii][Nn][Tt] ;
tinyint: [Tt][Ii][Nn][Yy][Ii][Nn][Tt] ;
TIMESTAMP: [Tt][Ii][Mm][Ee][Ss][Tt][Aa][Mm][Pp] ;
STRING: [Ss][Tt][Rr][Ii][Nn][Gg] ;
FLOAT: [Ff][Ll][Oo][Aa][Tt] ;
DOUBLE: [Dd][Oo][Uu][Bb][Ll][Ee] ;
NL: '\r'? '\n' ;
WS: [ \t]+ -> skip ;
任何帮助将不胜感激!
谢谢! 斯科特
解决方法
好!没关系!我忘记将规则“ options”更改为“ opts”,以及解决了字段列表中的问题。它编译了。 :-)
,ANTLR的词法分析器通过以下方式构造令牌:
- 尝试为单个令牌消耗尽可能多的字符(词法分析器规则)
- 如果有2个或更多匹配相同字符的词法分析器规则,则让第一个定义的“ win”规则获胜
给出您的词法分析器规则:
ROWTEXT: ~[\n\r]+ ;
和输入"load data\n"
,很明显(或应该清楚)将仅创建2个令牌:
ROWTEXT : 'load data'
NL : '\n'
解析器是否尝试匹配LOAD
令牌后跟DATA
令牌都没有关系:词法分析器独立于解析器进行操作。
您必须删除ROWTEXT
并尝试在解析器中进行构造:
rowtext
: ~NL+
;
请注意,解析器规则中的~
会否定标记,而不是字符。因此,它的意思是:“匹配NL以外的一个或多个令牌”。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。