2016-01-05 12 views
7

Tôi có ngữ pháp .g4 cho / một trình phân tích cú pháp/phân tích cú pháp, nơi lexer bỏ qua các mã thông báo tiếp tục dòng - không bỏ qua chúng. Dưới đây là các quy tắc lexer trong câu hỏi:Mã không liên kết vi phạm ngữ pháp của tôi

LINE_CONTINUATION : ' ' '_' '\r'? '\n' -> skip; 

Vấn đề này đang gây ra, đó là bất cứ khi nào một dòng liên tục bắt đầu từ cột 1, phân tích cú pháp thổi lên:

Sub Test() 
Debug.Print "Some text " & _ 
vbNewLine & "Some more text"  
End Sub 

tôi nghĩ "Hey Tôi biết! Tôi sẽ chỉ xử lý trước chuỗi Tôi đang cho ăn ANTLR để chèn thêm khoảng trống trước dấu gạch dưới và thay đổi ngữ pháp để chấp nhận nó! "

Vì vậy, tôi đã thay đổi quy tắc như vậy:

LINE_CONTINUATION : WS? WS '_' NEWLINE -> skip; 
NEWLINE : WS? ('\r'? '\n') WS?; 
WS : [ \t]+; 

... và mã kiểm tra trên đã cho tôi lỗi phân tích cú pháp này:

extraneous input 'vbNewLine' expecting WS

Còn bây giờ giải pháp duy nhất của tôi là để nói với tôi người dùng thụt lề mã của họ. Có cách nào tôi có thể sửa chữa quy tắc ngữ pháp đó không?

(Full VBA.g4 grammar file on GitHub)

+0

Tại sao bạn không hợp nhất LINE_CONTINUATION thành WS? –

+0

@IraBaxter 'WS' được sử dụng ở nhiều nơi khác. Ý anh là gì? –

+1

Bạn về cơ bản muốn tiếp tục dòng được xử lý như khoảng trắng. OK, sau đó thêm ý nghĩa từ vựng tiếp tục dòng vào mã thông báo WS. –

Trả lời

4

Bạn về cơ bản muốn tiếp tục dòng để bị đối xử như là khoảng trắng.

OK, sau đó thêm định nghĩa từ vựng về tiếp tục dòng vào mã thông báo WS. Sau đó, WS sẽ nhận được sự tiếp tục dòng, và bạn không cần LINECONTINUATION ở bất cứ đâu.

//LINE_CONTINUATION : ' ' '_' '\r'? '\n' -> skip; 
NEWLINE : WS? ('\r'? '\n') WS?; 
WS : ([ \t]+)|(' ' '_' '\r'? '\n'); 
+0

Tôi sẽ bị nguyền rủa. Nó đã làm việc! –

+0

Nói quá nhanh. Nó làm việc .... * cho trường hợp cụ thể trong OP * - vì vậy tôi đã cố gắng thay đổi quy tắc 'WS' thành' WS: [\ t] + ('_' '\ r'? '\ N') ?; ', và bây giờ nó hoạt động và hỗ trợ những thứ kỳ lạ như' Option Base 1' được chia thành 'Option _ \ r \ nBase _ \ r \ n1', điều này thật tuyệt vời - nhưng nó phá vỡ bất cứ khi nào một dòng tiếp tục có bất kỳ thụt lề nào và tôi không 't hiểu lý do tại sao, kể từ khi định nghĩa như tôi hiểu nó nên * cũng * phù hợp với một hoặc nhiều không gian/tab ... có một đầu mối? –

+1

Tôi nghĩ tôi đã định nghĩa mọi thứ khác nhau: HWS = [\ t \] +; ENDLINE = \ r? \ n; NEWLINE = HWS? DÒNG CUỐI; WS = HWS (HWLINE ENDLINE?)? ; Điều này bit cuối tay của bạn "tiếp tục dòng có thụt đầu dòng". Phần còn lại chỉ là bao thanh toán để làm cho nó dễ hiểu hơn. (HWS == "khoảng trắng ngang"). –

Các vấn đề liên quan