2013-07-19 36 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

呸,浪费。我在我的数组声明中使用数字而不是数字。