ANTLRWorks ошибка отладки

Когда я отлаживаю грамматику в 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;}
}

Есть ли способ решить эту ошибку. Как это обычно происходит

Благодарю вас.

2 ответа

Вы упомянули ANTLRWorks 3.4, который не существует. Существует ANTLR 3.4 и ANTLRWorks 1.4.3, поэтому я буду считать, что вы используете ANTLRWorks 1.4.3, которая использует ANTLR 3.4.

ANTLRWorks включает в себя копию ANTLR в свою сборку, поэтому вы не можете изменить версию ANTLR, которую использует ANTLRWorks. Это потому, что ANTLR не является коммерческим продуктом, который поддерживает обратную совместимость. Таким образом, чтобы гарантировать правильную работу ANTLRWorks, пользователю не предоставляется возможность выбрать версию ANTLR для использования.

По сути, ANTLR 3.4 была последней версией ANTLR 3.x, которая была выпущена, и она не была протестирована, чтобы убедиться, что она работает с ANTLRWorks. Одна из самых больших проблем заключается в том, что ANTLR 3.4 не будет генерировать диаграммы NFA и DFA, и они необходимы для работы ANTLRWorks, поскольку он использует выходные данные ANTLR для отображения диаграмм NFA и DFA.

Обычно Ter исправляет ANTLR, если при этом исправляется проблема с ANTLRWorks. Тем не менее, Тер и другие в основном остановили всю работу над ANTLR 3.X, чтобы перейти на ANTLR 4.x (Honey Badger). Таким образом, ANTLR 3.4 содержит ошибки и не исправляется для работы с ANTLRWorks, а также не будет новой версии ANTLRWorks 1.4.x, которая будет работать с ANTLR 3.x. Будет новая версия ANTLRWorks 2.x, которая будет работать с ANTLR 4.x.

Так что вы можете подумать, что я сейчас загнал вас в кирпичную стену, хорошо держитесь.

Я вырезал и вставил ваш образец прямо в ANTLRWorks 1.4.2, запустил отладчик и нажал кнопку "Перейти в конец". Работало без проблем. Я должен упомянуть, что это было сделано в системе Debian, работающей как виртуальная машина VMware. У меня есть это, чтобы ничто не было загрязнено.

Мораль истории заключается в том, чтобы держаться подальше от ANTLRWorks 1.4.3 и вместо этого использовать ANTLRWorks 1.4.2. Кроме того, если у вас есть машина, которая не может быть абсолютно уверена, не будет проблем, таких как различные версии JVM или неправильный путь к классу, и т. Д. Рассмотрите возможность использования виртуальных машин.

Я получаю то же исключение. Я мог бы решить это, переключившись с {$channel=HIDDEN} в {skip();},

Другие вопросы по тегам