G'day!Làm thế nào tôi có thể xây dựng một ngữ pháp sạch, giống Python trong ANTLR?
Làm cách nào để xây dựng một ngữ pháp ANTLR đơn giản xử lý các biểu thức nhiều dòng mà không cần dấu chấm phẩy hoặc dấu gạch chéo ngược?
Tôi đang cố gắng để viết một DSL đơn giản cho các biểu thức:
# sh style comments
ThisValue = 1
ThatValue = ThisValue * 2
ThisOtherValue = (1 + 2 + ThisValue * ThatValue)
YetAnotherValue = MAX(ThisOtherValue, ThatValue)
Nói chung, tôi muốn ứng dụng của tôi để cung cấp các kịch bản với một số giá trị được đặt tên ban đầu và kéo ra kết quả cuối cùng. Tuy nhiên, tôi đang bị treo trên cú pháp. Tôi muốn hỗ trợ nhiều biểu thức dòng như sau:
# Note: no backslashes required to continue expression, as we're in brackets
# Note: no semicolon required at end of expression, either
ThisValueWithAReallyLongName = (ThisOtherValueWithASimilarlyLongName
+AnotherValueWithAGratuitouslyLongName)
Tôi bắt đầu với một ngữ pháp ANTLR như thế này:
exprlist
: (assignment_statement | empty_line)* EOF!
;
assignment_statement
: assignment NL!?
;
empty_line
: NL;
assignment
: ID '=' expr
;
// ... and so on
Có vẻ như đơn giản, nhưng tôi đã gặp rắc rối với dòng mới:
warning(200): StackOverflowQuestion.g:11:20: Decision can match input such as "NL" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
mặt đồ họa, trong org.antlr.works.IDE:
tôi đã đá ngữ pháp xung quanh, nhưng luôn luôn kết thúc với hành vi vi phạm hành vi mong đợi:
- Một newline không cần vào cuối của tập tin
- dòng rỗng được chấp nhận
- Mọi thứ trong một dòng từ dấu thăng đơn trở lên sẽ bị loại bỏ dưới dạng nhận xét
- Bài tập kết thúc bằng cuối dòng, không dấu chấm phẩy
- Biểu thức có thể trải dài nhiều dòng nếu được bọc trong ets
Tôi có thể tìm thấy ví dụ về ngữ pháp ANTLR với nhiều đặc điểm này. Tôi thấy rằng khi tôi cắt chúng xuống để hạn chế sự biểu cảm của họ chỉ là những gì tôi cần, tôi sẽ phá vỡ một thứ gì đó. Những người khác thì quá đơn giản, và tôi phá vỡ chúng khi tôi thêm tính biểu cảm.
Tôi nên dùng góc nào với ngữ pháp này? Bạn có thể chỉ ra bất kỳ ví dụ nào không phải là ngôn ngữ hoàn chỉnh tầm thường hoặc đầy đủ không?
Bây giờ tôi cần phải tìm ra cách để có được tokenizer để làm điều đó nâng nặng. Quay lại tài liệu, tôi đoán vậy. :) –
John, nó vẫn eludes tôi. Cú pháp ngữ pháp ANTLR có trình nạp mã thông báo NL trước EOF là gì? –
+1 Đối với luôn kết thúc trên một dòng mới, làm cho mọi thứ sạch hơn rất nhiều. Cảm ơn. – Craz