0

ANTLRWorks 3.4 で文法をデバッグすると、次のエラーが表示されます。

javax.swing.text.BadLocationException: Position not represented by view

上記のエラーが発生した文法を以下に示します。

grammar CMinusMinus;

program         : (vardeclaration | fundeclaration)* EOF                ;
vardeclaration  : INT ID (OPENSQ NUM CLOSESQ)? SEMICOL                  ;

fundeclaration  : typespecifier ID OPENP params CLOSEP compoundstmt     ;
typespecifier   : INT | VOID                                            ;
params          : VOID | paramlist                                      ;
paramlist       : param (COMMA param)*                                  ;
param           :  INT ID (OPENSQ CLOSESQ)?                             ;

compoundstmt    : OPENCUR vardeclaration* statement* CLOSECUR           ;
statementlist   : statement*                                            ;
statement       : expressionstmt | compoundstmt | selectionstmt 
                | iterationstmt | returnstmt                            ;
expressionstmt  : (expression)? SEMICOL                                 ;
selectionstmt   : IF OPENP expression CLOSEP statement
                ( (ELSE)=> ELSE statement
                | ( )
                )
                ;
iterationstmt   : WHILE OPENP expression CLOSEP statement               ;
returnstmt      : RETURN (expression)? SEMICOL                          ;

expression      : (var ASSIGN) => var ASSIGN expression 
                | simpleexpression                                      ;
var             : ID ( OPENSQ expression CLOSESQ )?                     ;

simpleexpression: addexpr ( ( LOREQ | LESS | GRTR | GOREQ | EQUAL | NTEQL) addexpr)?    ;
addexpr         : mulexpr ( ( PLUS | MINUS ) mulexpr)*                  ;
mulexpr         : factor  ( ( MULTI | DIV  ) factor )*                  ; 

factor          : ( OPENP expression CLOSEP ) | var | call  | NUM       ;
call            : ID OPENP arglist? CLOSEP                              ;
arglist         : expression ( COMMA expression)*                       ;

ELSE    : 'else'    ;
IF      : 'if'      ;
INT     : 'int'     ;
RETURN  : 'return'  ;
VOID    : 'void'    ;
WHILE   : 'while'   ;


PLUS    : '+' ;
MINUS   : '-' ;
MULTI   : '*' ;
DIV     : '/' ;

LESS    : '<'  ;
LOREQ   : '<=' ;
GRTR    : '>'  ;
GOREQ   : '>=' ;

EQUAL   : '==' ;
NTEQL   : '!=' ;
ASSIGN  : '='  ;

SEMICOL : ';' ;
COMMA   : ',' ;

OPENP   : '(' ;
CLOSEP  : ')' ;
OPENSQ  : '[' ;
CLOSESQ : ']' ;
OPENCUR : '{' ;
CLOSECUR: '}' ;

SCOMMENT: '/*' ;
ECOMMENT: '*/' ;


ID  : ('a'..'z' | 'A'..'Z')+/*(' ')*/ ;
NUM : ('0'..'9')+ ;
WS  : (' ' | '\t' | '\n' | '\r'/* | '\f'*/)+ {$channel = HIDDEN;};
COMMENT: '/*' .* '*/' {$channel = HIDDEN;};

テストファイルは、

/* A program to perform selection sort on a 10
element array. */

int x[10];

int miniloc ( int a[], int low, int high )
{ int i, int x, int k;


if (a<b)
if (b<c)
b=0;
else
c=0;
else
a=0;




k= low;
x = a[low];
i = low + 1;
while ( i < high)
{ if (a[i] < x)
{ x= a[i];
    k= i;}
i = i+1;
}
return k;
}

void sort( int a[], int low, int high)
{ int i, int k;
i = low;
while (i < high - 1)
{ int t;
k = minloc(a,i,high);
t = a[k];
a[k] = a[i];
a[i] = t;
i = i+1;
}
}

void main(void)
{
int i;
i = 0;
while (i < 10)
{ x[i] = input();
 i = i+1;}
sort(x, 0, 10);
i=0;
while(i<10)
{ output(x[i]);
i = i + 1;}
}

このエラーを解決する方法はありますか。これが通常どのように起こるか

ありがとうございました。

4

2 に答える 2

2

存在しないANTLRWorks 3.4について言及しました。ANTLR 3.4 と ANTLRWorks 1.4.3 がありますので、ANTLR 3.4 を使った ANTLRWorks 1.4.3 を使っていると思います。

ANTLRWorks のビルドには ANTLR のコピーが含まれているため、ANTLRWorks が使用する ANTLR のバージョンを変更することはできません。これは、ANTLR が下位互換性を維持する商用製品ではないためです。そのため、ANTLRWorks が適切に機能することを保証するために、使用する ANTLR のバージョンを選択するオプションがユーザーに与えられていません。

基本的に、ANTLR 3.4 はリリースされた ANTLR 3.x の最後のバージョンであり、ANTLRWorks で動作することを確認するためにテストされていません。最大の問題の 1 つは、ANTLR 3.4 が NFA および DFA ダイアグラムを生成しないことです。これらは、ANTLR の出力を使用して NFA および DFA ダイアグラムを表示するため、ANTLRWorks が機能するために必要です。

通常、Ter は、そうすることで ANTLRWorks の問題が解決される場合、ANTLR を修正します。しかし、Terらは基本的にANTLR 3.Xでの作業をすべて中止し、ANTLR 4.x (Honey Badger) に移行しました。そのため、ANTLR 3.4 にはバグがあり、ANTLRWorks で動作するようにパッチが適用されておらず、ANTLR 3.x に対応する新しい ANTLRWorks 1.4.x バージョンもありません。ANTLR 4.x に対応する新しい ANTLRWorks 2.x が登場します。

ですから、私があなたをレンガの壁に追いやったと思うかもしれません。

あなたのサンプルを切り取って ANTLRWorks 1.4.2 に貼り付け、デバッガーを起動し、[Go To End] ボタンをクリックしました。問題なく動作しました。これは、VMware 仮想マシンとして実行されている Debian システムで実行されたことに言及する必要があります。他のものに汚染されないようにこれを持っています。

この話の教訓は、ANTLRWorks 1.4.3 を避け、代わりに ANTLRWorks 1.4.2 を使用することです。また、異なる JVM バージョンや不適切なクラスパスなどの問題がないことを絶対に確信できないマシンがある場合は、仮想マシンの使用を検討してください。

于 2012-03-11T18:37:30.507 に答える
1

同じ例外が発生しています。{$channel=HIDDEN}からに切り替えることで解決できました{skip();}

于 2012-11-15T14:54:31.693 に答える