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)
 ;
4

2 回答 2

2

Number您在arrayNotation解析器规则中引用了不存在的规则。

词法分析器中确实存在Digit规则,但它只会匹配一位数。例如,1is a Digit, 但是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您在此处创建的规则。

于 2013-07-19T11:47:48.207 回答
0

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

于 2013-07-19T10:34:09.920 回答