2013-07-19 67 views
1

我有一個非常簡單的語法解析的語句。掙扎解析數組符號

下面是需要被解析的語句類型的示例:

a.b.c 

a.b.c == "88" 

我遇到的問題是,數組符號不匹配。例如,那些不起作用的東西:

a.b[0].c 

a[3][4] 

我希望有人能指出我在這裏做錯了什麼。 (我在ANTLRWorks測試)

這裏是語法(generationUnit是我的入口點):空間

grammar RatBinding; 

generationUnit: testStatement | statement; 

arrayAccesor : identifier arrayNotation+; 
arrayNotation: '[' Number ']'; 

testStatement: 
    (statement | string | Number | Bool) 

    (greaterThanAndEqual 
     | lessThanOrEqual 
     | greaterThan 
     | lessThan | notEquals | equals) 

    (statement | string | Number | Bool) 
; 

part: identifier | arrayAccesor; 

statement: part ('.' part)*; 

string: ('"' identifier '"') | ('\'' identifier '\''); 

greaterThanAndEqual: '>='; 
lessThanOrEqual: '<='; 
greaterThan: '>'; 
lessThan: '<'; 
notEquals : '!='; 
equals: '=='; 
identifier: Letter (Letter|Digit)*; 


Bool : 'true' | 'false'; 

ArrayLeft: '\u005B'; 
ArrayRight: '\u005D'; 

Letter 
    : '\u0024' | 
     '\u0041'..'\u005a' | 
     '\u005f '| 
     '\u0061'..'\u007a' | 
     '\u00c0'..'\u00d6' | 
     '\u00d8'..'\u00f6' | 
     '\u00f8'..'\u00ff' | 
     '\u0100'..'\u1fff' | 
     '\u3040'..'\u318f' | 
     '\u3300'..'\u337f' | 
     '\u3400'..'\u3d2d' | 
     '\u4e00'..'\u9fff' | 
     '\uf900'..'\ufaff' 
     ; 

Digit 
    : '\u0030'..'\u0039' | 
     '\u0660'..'\u0669' | 
     '\u06f0'..'\u06f9' | 
     '\u0966'..'\u096f' | 
     '\u09e6'..'\u09ef' | 
     '\u0a66'..'\u0a6f' | 
     '\u0ae6'..'\u0aef' | 
     '\u0b66'..'\u0b6f' | 
     '\u0be7'..'\u0bef' | 
     '\u0c66'..'\u0c6f' | 
     '\u0ce6'..'\u0cef' | 
     '\u0d66'..'\u0d6f' | 
     '\u0e50'..'\u0e59' | 
     '\u0ed0'..'\u0ed9' | 
     '\u1040'..'\u1049' 
    ; 

WS : [ \r\t\u000C\n]+ -> channel(HIDDEN) 
; 

回答

2

您在arrayNotation解析器規則中引用不存在的規則Number

一個Digit規則確實存在於詞法分析器,但它只會匹配單個數字。例如,1Digit,但10是兩個單獨的Digit令牌,因此a[10]將與arrayAccesor規則不匹配。你可能想在兩個部分來解決這個:

  1. 創建Number令牌由一個或多個數字。

    Number 
        : Digit+ 
        ; 
    
  2. 馬克Digit作爲一個片段規則,以表明它不會對自己構成標記,但僅僅是打算從其他詞法規則引用。

    fragment // prevents a Digit token from being created on its own 
    Digit 
        : ... 
    

你不會需要改變arrayNotation,因爲它已經引用您在這裏創建的Number規則。

+0

感謝,我張貼(慚愧) – lennel

+0

@lennel我注意到了,但還是添加了這個答案,以便未來的用戶可以看到一個更完整的響應後,發現這個愚蠢一分鐘。 :) –

0

呸,浪費。我在我的數組聲明中使用數字而不是數字。