Tôi làm cách nào để thực hiện thụt đầu dòng dưới dạng khối phân tách trong bison + flex. Cũng giống như trong python. Tôi đang viết ngôn ngữ lập trình của riêng mình (chủ yếu là để giải trí, nhưng tôi dự định sử dụng nó cùng với một công cụ trò chơi), tôi sẽ cố gắng tìm ra thứ gì đó đặc biệt để giảm thiểu sự sắp xếp và tối đa hóa tốc độ dev.Cách sử dụng thụt đầu dòng làm dấu phân tách khối với bison và flex
Tôi đã viết một trình biên dịch (thực tế là `langToy ' tới trình dịch Nasm) trong C, nhưng không thành công. Bởi một số lý do nó chỉ có thể xử lý một chuỗi trong toàn bộ tập tin nguồn (tốt, tôi đã tỉnh táo được hơn 48 giờ - vậy ... Bạn biết đấy, suy thoái não).
Tôi không biết nếu dấu ngoặc nhọn và/hoặc bắt đầu -> kết thúc dễ thực hiện hơn (tôi không gặp vấn đề khi làm điều đó) hay chỉ là bộ não của tôi bị khóa.
Cảm ơn trước!
Cập nhật: Được rồi, tôi không có đầu mối về làm thế nào để làm điều đó với flex. Tôi gặp sự cố khi trả lại nhiều DEDENT cho trình phân tích cú pháp. Flex/Bison tương đối mới đối với tôi.
Cập nhật 2: Đây là flex-file tôi đã đi lên với cho đến nay; nó không hoàn toàn nhận được nó:
%x t
%option noyywrap
%{
int lineno = 0, ntab = 0, ltab = 0, dedent = 0;
%}
%%
<*>\n { ntab = 0; BEGIN(t); }
<t>\t { ++ntab; }
<t>. { int i; /* my compiler complains not c99 if i use for(int i=0... */
if(ntab > ltab)
printf("> indent >\n");
else if(ntab < ltab)
for(i = 0; i < ltab - ntab; i++)
printf("< dedent <\n");
else
printf("= =\n");
ltab = ntab; ntab = 0;
BEGIN(INITIAL);
/* move to next rule */
REJECT;}
. /* ignore everything else for now */
%%
main()
{
yyin = fopen("test", "r");
yylex();
}
Bạn có thể thử chơi với nó, có thể bạn thấy những gì tôi đang thiếu. trả về nhiều suy luận sẽ dễ dàng trong haXe (return t_dedent (num);).
Mã này không phải lúc nào cũng khớp với các thụt lề/suy luận một cách chính xác.
Cập nhật 3: Tôi nghĩ rằng tôi sẽ từ bỏ hy vọng về flex và làm theo cách của riêng tôi, Nếu có ai biết làm thế nào để làm điều đó trong flex Tôi sẽ rất vui khi nghe nó anyways.
Có vẻ như bạn đã nhận được nó, nhưng tôi muốn các tabstops được tính là 2 dấu cách. Vì vậy, tôi đoán rằng dòng phải là current_line_indent = (current_line_indent + 2) & ~1; – Frank
Có - khi bạn thấy tab, bạn cần phải bump current_line_indent vào tabstop tiếp theo. –