2012-08-31 45 views
9

Tôi có ngữ pháp JavaScript ANTLR (được lấy từ Internet), dường như hỗ trợ mọi thứ ngoại trừ các chữ regex.Phân tích cú pháp JavaScript regex với ANTLR

Vấn đề với một regex đen là bạn có hai quy tắc, về cơ bản:.

multiplicativeExpression 
    : unaryExpression (LT!* ('*' | '/' | '%')^ LT!* unaryExpression)* 

regexLiteral 
    : '/' RegexLiteralChar* '/' 

nơi RegexLiteralChar quy tắc sử dụng quy tắc lexer khác nhau hơn là một biểu hiện bình thường (ví dụ như một báo giá kép không chấm dứt nó).

Điều này có nghĩa là tôi cần, theo một cách nào đó, hãy thay đổi một số loại trạng thái lexer từ trình phân tích cú pháp của tôi. Tôi có thể làm cái này như thế nào? Thậm chí có thể không?

+1

Truyền thông giữa phân tích cú pháp và quy tắc lexer là không thể. Có lẽ có một cái nhìn tại ngữ pháp này, mà dường như để xử lý regex-literals: http://research.xebic.com/es3/ (kiểm tra các tập tin ZIP). –

Trả lời

5

Nhìn vào ngữ pháp được đề cập trong bình luận của Bart Kiers here, bạn có thể thấy nhận xét này,

Các thách thức lớn phải đối mặt trong việc xác định ngữ pháp này là:

-1- mơ hồ xung quanh DIV đăng nhập liên quan đến biểu thức nhân và biểu thức chính quy theo nghĩa đen. Đây là được giải quyết với một số phép thuật lexer điều khiển: một thuộc tính ngữ nghĩa gated biến sự công nhận của biểu thức thông thường hoặc tắt, dựa trên giá trị của tài sản RegularExpressionsEnabled. Khi các cụm từ thông dụng được bật, chúng được ưu tiên hơn phân chia biểu thức . Quyết định cho dù biểu thức thông thường được bật là dựa trên chẩn đoán rằng mã thông báo trước đó có thể được coi là mã thông báo cuối cùng của toán hạng bên trái của một bộ phận.

...

Các areRegularExpressionsEnabled() chức năng được định nghĩa là,

private final boolean areRegularExpressionsEnabled() 
{ 
    if (last == null) 
    { 
     return true; 
    } 
    switch (last.getType()) 
    { 
    // identifier 
     case Identifier: 
    // literals 
     case NULL: 
     case TRUE: 
     case FALSE: 
     case THIS: 
     case OctalIntegerLiteral: 
     case DecimalLiteral: 
     case HexIntegerLiteral: 
     case StringLiteral: 
    // member access ending 
     case RBRACK: 
    // function call or nested expression ending 
     case RPAREN: 
      return false; 
    // otherwise OK 
     default: 
      return true; 
    } 
} 

Và sau đó các chức năng được sử dụng trong biểu thức RegularExpressionLiteral,

RegularExpressionLiteral 
    : { areRegularExpressionsEnabled() }?=> DIV RegularExpressionFirstChar RegularExpressionChar* DIV IdentifierPart* 
    ; 
Các vấn đề liên quan