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

Digitlexer にはルールが存在しますが、一致するのは 1 桁の数字のみです。たとえば、1は ですが、Digit210つの別個Digitのトークンであるため、ルールa[10]に一致しません。arrayAccesorおそらく、これを 2 つの部分で解決する必要があります。

  1. Number1 つ以上の数字で構成されるトークンを作成します。

    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 に答える