Cách khớp với bất kỳ văn bản nào trong ANTLRv4? Tôi có nghĩa là văn bản, đó là không rõ tại thời điểm viết văn phạm?Kết hợp văn bản tùy ý (cả biểu tượng và dấu cách) với ANTLR?
ngữ pháp của tôi là sau:
grammar Anytext;
line :
comment;
comment : '#' anytext;
anytext: ANY*;
WS : [ \t\r\n]+;
ANY : .;
Và mã của tôi là sau:
String line = "# This_is_a_comment";
ANTLRInputStream input = new ANTLRInputStream(line);
AnytextLexer lexer = new AnytextLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
AnytextParser parser = new AnytextParser(tokens);
ParseTree tree = parser.comment();
System.out.println(tree.toStringTree(parser)); // print LISP-style tree
Output sau:
line 1:1 extraneous input ' ' expecting {<EOF>, ANY}
(comment # (anytext T h i s _ i s _ a _ c o m m e n t))
Nếu tôi thay đổi ANY
quy tắc
ANY : [ \t\r\n.];
nó dừng nhận ra bất kỳ biểu tượng nào cả.
UPDATE1
tôi không có ký tự dòng cuối ở cuối.
UPDATE 2
Vì vậy, tôi đã hiểu, rằng không thể để phù hợp với bất kỳ văn bản với lexer từ lexer không thể cho phép nhiều lớp. Nếu tôi xác định quy tắc lexer cho bất kỳ biểu tượng nào, nó sẽ ẩn tất cả các quy tắc khác hoặc không hoạt động.
Nhưng câu hỏi vẫn tồn tại.
Làm thế nào để khớp tất cả các biểu tượng ở cấp trình phân tích cú pháp?
Giả sử tôi có dữ liệu hình bảng và tôi không thể xử lý một số trường và bỏ qua các trường khác. Nếu tôi có anytext
quy tắc, tôi sẽ viết
infoline :
(codepoint WS 'field1' WS field1Value) |
(codepoint WS 'field2' WS field2Value) |
(codepoint WS anytext);
hàng ở đây tôi đang phân tích nếu cột thứ 2 chứa field1
và field2
giá trị và bỏ qua hàng khác.
Làm cách nào để thực hiện phương pháp này?
Tôi đã chỉnh sửa bài đăng của bạn để cung cấp chính xác quy tắc tương tự trong cú pháp ANTLR 4. Trên một ghi chú riêng biệt, tôi khuyên * không * bao gồm cả '' \ r '? '\ n'' dòng terminator như là một phần của quy tắc 'LINE_COMMENT' chính nó (làm cho nó tiêu thụ ký tự lên đến, nhưng không bao gồm hết dòng). Có một vài lý do tôi khuyên bạn nên điều này, nhưng lớn nhất là một thực tế là trong hình thức hiện tại 'LINE_COMMENT' sẽ không phù hợp với một bình luận trên dòng cuối cùng của một tập tin nếu nó không được theo sau bởi một terminator dòng rõ ràng. –
vâng, đó là dành cho ANTLR 3, cảm ơn bạn đã chỉnh sửa – hoaz
Tại sao quá phức tạp? Có thể viết đơn giản hơn không? Tại sao quy tắc của tôi không hoạt động? –