ANTLRWorks ошибка отладки - PullRequest
       44

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

0 голосов
/ 03 марта 2012

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

2 голосов
/ 11 марта 2012

Вы упомянули 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 или неправильный путь к классу и т. Д., Рассмотрите возможность использования виртуальных машин.

1 голос
/ 15 ноября 2012

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

...