Trong các phiên bản trước của Jison, nó đã có thể có một tính năng Flex-như thế cho phép xác định các biến thể truy cập vào tất cả các lexer và phân tích cú pháp bối cảnh, chẳng hạn như:Jison biến toàn cục
%{
var chars = 0;
var words = 0;
var lines = 0;
%}
%lex
%options flex
%%
\s
[^ \t\n\r\f\v]+ { words++; chars+= yytext.length; }
. { chars++; }
\n { chars++; lines++ }
/lex
%%
E : { console.log(lines + "\t" + words + "\t" + chars) ; };
Ref .:Flex like features?
Mặc dù, trong phiên bản mới nhất của Jison, điều này không hợp lệ. Không thể truy cập được chars
, words
và lines
từ ngữ cảnh phân tích cú pháp, tạo ra lỗi.
Tìm kiếm thêm về phiên bản mới, tôi thấy rằng có thể bằng cách xác định đầu ra, trên ngữ cảnh của trình phân tích, bên trong %{ ... %}
, nhưng nó không hoạt động, mặc dù nó được sử dụng cho các câu lệnh nhiều dòng. Tôi đang tạo mã từ một nguồn đến ngôn ngữ đích và tôi sẽ làm cho mã này dễ dàng hơn, áp dụng đúng thụt đầu dòng, được kiểm soát bởi phạm vi và tạo trực tiếp từ trình phân tích cú pháp, mà không xây dựng một AST.
Định nghĩa toàn cầu hiện đang hoạt động như thế nào trong Jison?
cho nhiều biểu thức biến toàn cầu này được khởi tạo khác nhau cho mỗi E. khác trong trường hợp đó nếu tôi muốn lưu trữ giá trị bằng cách concating một chuỗi của nó không hoạt động. Đây là ngữ pháp của tôi nếu u có thể đề xuất những thay đổi nào tôi phải thực hiện để biến của tôi '$ x' có thể lưu trữ tất cả giá trị trên tất cả E. https://jsfiddle.net/Lnukko75/1/ –