Tôi đã thấy nhiều văn phạm tiếng ANTLR sử dụng xử lý khoảng trắng như thế này:ANTLR4: xử lý Khoảng trắng
WS: [ \n\t\r]+ -> skip;
// or
WS: [ \n\t\r]+ -> channel(HIDDEN);
Vì vậy, các khoảng trắng được vứt bỏ lần lượt gửi đến kênh ẩn.
Với ngữ pháp như thế này:
grammar Not;
start: expression;
expression: NOT expression
| (TRUE | FALSE);
NOT: 'not';
TRUE: 'true';
FALSE: 'false';
WS: [ \n\t\r]+ -> skip;
đầu vào hợp lệ là 'không đúng' hoặc 'không sai' mà còn 'nottrue' mà không phải là một kết quả mong muốn. Thay đổi ngữ pháp để:
grammar Not;
start: expression;
expression: NOT WS+ expression
| (TRUE | FALSE);
NOT: 'not';
TRUE: 'true';
FALSE: 'false';
WS: [ \n\t\r];
sửa chữa vấn đề này, nhưng tôi không muốn để xử lý các khoảng trắng tay trong từng quy tắc.
Nói chung tôi muốn có khoảng trống giữa mỗi mã thông báo với một số ngoại lệ (ví dụ: '! True' không cần khoảng trắng ở giữa).
Có cách nào đơn giản để thực hiện việc này không?
Cảm ơn. Điều đó hoạt động như mong muốn cho '* nottrue *' (không hợp lệ) và '*! True *' (hợp lệ). Bạn cũng có một ý tưởng làm thế nào tôi có thể làm cho một ngoại lệ của quy tắc này, để có thể cho một số đầu vào khác để bỏ qua khoảng trắng? Giống như '* A B true *', trong đó khoảng trắng giữa A và B là tùy chọn. Vì vậy, điều này cũng hợp lệ: '* AB true *', nhưng '* ABtrue *' thì không. – flux