Tôi đã có một tác dụng phụ lạ của một quy tắc lexer antlr và tôi đã tạo ra một ví dụ làm việc tối thiểu (gần như) để chứng minh nó. Trong ví dụ này, tôi muốn khớp với chuỗi [0..1]
chẳng hạn. Nhưng khi tôi gỡ lỗi ngữ pháp, luồng mã thông báo đến trình phân tích cú pháp chỉ chứa [..1]
. Số nguyên đầu tiên, bất kể có bao nhiêu chữ số chứa luôn luôn được tiêu thụ và tôi không có đầu mối nào về cách điều đó xảy ra. Nếu tôi loại bỏ quy tắc FLOAT
, mọi thứ đều ổn, vì vậy tôi đoán sai lầm nằm ở đâu đó trong quy tắc đó. Nhưng vì nó không phù hợp với bất cứ thứ gì trong số [0..1]
, tôi khá bối rối.Quy tắc lexer ANTLR tiêu thụ các ký tự ngay cả khi không khớp?
Tôi rất vui vì bất kỳ con trỏ nào mà tôi có thể đã sai. Đây là ví dụ của tôi:
grammar min;
options{
language = Java;
output = AST;
ASTLabelType=CommonTree;
backtrack = true;
}
tokens {
DECLARATION;
}
declaration : LBRACEVAR a=INTEGER DDOTS b=INTEGER RBRACEVAR -> ^(DECLARATION $a $b);
EXP : 'e' | 'E';
LBRACEVAR: '[';
RBRACEVAR: ']';
DOT: '.';
DDOTS: '..';
FLOAT
: INTEGER DOT POS_INTEGER
| INTEGER DOT POS_INTEGER EXP INTEGER
| INTEGER EXP INTEGER
;
INTEGER : POS_INTEGER | NEG_INTEGER;
fragment NEG_INTEGER : ('-') POS_INTEGER;
fragment POS_INTEGER : NUMBER+;
fragment NUMBER: ('0'..'9');
Hiện tại đó là hành vi không mong muốn (đối với tôi ít nhất). Cảm ơn ví dụ toàn diện, tôi đã có tất cả và chạy ngay bây giờ :-) – Lichtblitz
@Lichtblitz, bạn được chào đón, và vâng, tokenizing '..' (kết hợp với với INT- và FLOAT-tokens) là khó khăn ! :) –