2015-05-31 15 views
8

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, wordslines 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?

Trả lời

4

Phiên bản hiện tại của Jison có variable named yy có mục đích là cho phép chia sẻ dữ liệu giữa các hành động từ vựng, hành động ngữ nghĩa và các mô-đun khác. mẫu mã của bạn có thể làm việc nếu bạn lưu trữ tất cả các biến trong yy như sau:

%lex 
%options flex 

%{ 
if (!('chars' in yy)) { 
    yy.chars = 0; 
    yy.words = 0; 
    yy.lines = 1; 
} 
%} 

%% 
[^ \t\n\r\f\v]+ { yy.words++; yy.chars += yytext.length; } 
. { yy.chars++; } 
\n { yy.chars++; yy.lines++ } 
/lex 

%% 
E : { console.log(yy.lines + "\t" + yy.words + "\t" + yy.chars); }; 

Đoạn mã trên đã được thử nghiệm sử dụng Jison 0.4.13 trên Jison's try page.

+0

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/ –

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